我今天遇到了以下 T-SQL:
select c from (select 1 union all select 1) as d(c)
產生以下結果:
c
-----------
1
1
讓我感到困惑的部分是d(c)
在試圖了解發生了什么時,我將 T-SQL 修改為:
select c, b from (select 1, 2 union all select 3, 4) m(c, b)
產生以下結果:
c b
----------- -----------
1 2
3 4
很明顯,d和m是表參考,而括號c和b中的字母是對列的參考。我無法在 msdn 上找到相關檔案,但很好奇是否
- 你知道這樣的語法嗎?
- 什么是有用的用例場景?
uj5u.com熱心網友回復:
select c from (select 1 union all select 1) as d(c)
是相同的
select c from (select 1 as c union all select 1) as d
在第一個查詢中,您沒有在子查詢中命名列,而是在子查詢之外命名它們,
在第二個查詢中,您命名子查詢中的列
如果您這樣嘗試(不命名子查詢中的列)
select c from (select 1 union all select 1) as d
您將收到以下錯誤
沒有為“d”的第 1 列指定列名
這也在檔案中
至于用法,有人喜歡寫第一種,有人喜歡寫第二種,隨便你。這都一樣
uj5u.com熱心網友回復:
觀察:使用表建構式values無法命名列,這使得必須在表別名之后使用列命名:
select * from
(values
(1,2) -- can't give a column name here
,(3,4)
) as tableName(column1,column2) -- gotta do it here
uj5u.com熱心網友回復:
您已經有評論指出派生表如何作業的檔案,但沒有回答您有關此功能的有用用例的問題。
就我個人而言,每當我想創建一組將在您的陳述句中廣泛使用的可尋址值時,或者當我出于任何原因想要復制行時,我發現此功能很有用。
可尋址值的一個示例將是以下更復雜的版本,其中v派生表中的計算值可以通過更合理的名稱多次使用,而不是難以遵循的重復計算:
select p.ProductName
,p.PackPricePlusVAT - v.PackCost as GrossRevenue
,etc
from dbo.Products as p
cross apply(values(p.UnitsPerPack * p.UnitCost
,p.UnitPrice * p.UnitsPerPack * 1.2
,etc
)
) as v(PackCost
,PackPricePlusVAT
,etc
)
并且能夠復制行的一個示例可能是創建一個用于驗證資料的例外報告,該報告將DataError為該行滿足的每個條件輸出dbo.Product一行:
select p.ProductName
,e.DataError
from dbo.Products as p
cross apply(values('Missing Units Per Pack'
,case when p.SoldInPacks = 1 and isnull(p.UnitsPerPack,0) < 1 then 1 end
)
,('Unusual Price'
,case when p.Price > (p.UnitsPerPack * p.UnitCost) * 2 then 1 end
)
,(etc)
) as e(DataError
,ErrorFlag
)
where e.ErrorFlag = 1
如果您能理解這兩個腳本在做什么,您應該會找到大量示例,說明能夠生成附加值或附加資料行會非常有幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/446851.html
下一篇:均勻分布相關記錄
