每當我讀到如何使用 aJOIN到UPDATE表時,別名的使用總是讓我稍微有點反感。例如,從這里獲取此代碼
UPDATE ud
SET assid = s.assid
FROM ud u
JOIN sale s ON u.id=s.id
我很清楚這assid來自ud第 1 行的表格。我不清楚的是為什么ud需要在第 3 行和第 4 行使用別名。這不是一個孤立的事件。例如,同一頁面上的另一個答案是
update u
set u.assid = s.assid
from ud u
inner join sale s on
u.id = s.udid
u它在很多地方都使用了別名。
JOIN這給了我我的問題:在嘗試使用to時,你做什么/不需要別名的確切規則是什么UPDATE?直接參考任何相關檔案將不勝感激,但不是必需的。
uj5u.com熱心網友回復:
從技術上講,您不需要在列參考上使用別名前綴:
- 在左側
SET,從邏輯上講,該列不可能來自任何其他表 - 如果沒有需要消除歧義的列名沖突(并且您肯定知道您永遠不會將列添加到任何可能成為沖突的相關表中)
恕我直言,您不必擔心任何“規則”,即您何時可以不加前綴而擺脫困境,而只需始終參考列所屬的別名。為什么不總是清晰明確?
如果您正在尋找“官方”規則,我認為您將不走運。在此檔案中找不到任何關于此的內容,盡管第一個示例有這個,恕我直言有點過分(并且不使用別名):
UPDATE dbo.Table2
SET dbo.Table2.ColB = dbo.Table2.ColB dbo.Table1.ColB
FROM dbo.Table2
INNER JOIN dbo.Table1
ON (dbo.Table2.ColA = dbo.Table1.ColA);
在這個站點上,許多長期存在的規范示例在所有列參考上都是完全明確的,例如這個。
uj5u.com熱心網友回復:
請注意,如果您使用 CTE 而不是 UPDATE ... FROM,這一切都不是神秘的,例如,從回傳要更新的行的 SELECT 開始
select u.id, u.assid, s.assid new_assid
FROM ud u
JOIN sale s ON u.id=s.id
. 檢查并驗證資料,然后將其包裝在 CTE 中并更新它
with q as
(
select u.id, u.assid, s.assid new_assid
FROM ud u
JOIN sale s ON u.id=s.id
)
update q set assid = new_assid
uj5u.com熱心網友回復:
該檔案特別指出了這一點:
FROM <table_source>...剪斷...
如果要更新的物件與子句中的物件相同,并且
FROM子句中只有一個對物件的參考,則FROM可以指定也可以不指定物件別名。如果正在更新的物件在子句中出現多次FROM,并且只有一次,則對該物件的參考不得指定表別名。子句中對物件的所有其他參考FROM必須包含物件別名。
您不必為任何表指定別名。如果您不這樣做,那么該表顯然只能指定一次。
但是,如果您確實提供了別名,則取決于:如果該表存在于查詢中一次,那么有或沒有別名都可以。否則,您必須使用別名。
老實說, 正如@AaronBertrand 所說,幫自己和每個人一個忙,并始終在每個表上使用別名,并在UPDATE alias SET部分中指定該別名。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/469335.html
