亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

ANSI連接和非ANSI連接查詢的執行情況會有所不同嗎?

ANSI連接和非ANSI連接查詢的執行情況會有所不同嗎?

哈士奇WWW 2019-06-17 17:45:15
ANSI連接和非ANSI連接查詢的執行情況會有所不同嗎?我的業務邏輯在大約7000行T-SQL存儲過程中,其中大多數具有下一個聯接語法:SELECT A.A, B.B, C.CFROM aaa AS A, bbb AS B, ccc AS CWHERE     A.B = B.IDAND B.C = C.IDAND C.ID = @param如果我將這樣的查詢替換為:SELECT A.A, B.B, C.CFROM aaa AS AJOIN bbb AS B   ON A.B = B.IDJOIN ccc AS C   ON B.C = C.ID   AND C.ID = @param還是他們是一樣的?
查看完整描述

3 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

這兩個查詢是相同的,除了第二個查詢是ANSI-92 SQL語法,第一個查詢是不包含JOIN子句的舊SQL語法。它們應該產生完全相同的內部查詢計劃,盡管您可能希望檢查。

您應該使用ansi-92語法有以下幾個原因。

  • JOIN子句的使用將關系邏輯與篩選邏輯(WHERE)分離開來,因此更清晰、更容易理解。
  • 與這個特定的查詢無關,但在一些情況下,舊的外部聯接語法(使用+)是不明確的,因此查詢結果依賴于實現-或者根本無法解析查詢。這種情況不會發生在ANSI-92中。
  • 這是一個很好的實踐,因為現在大多數開發人員和dba將使用ANSI-92,您應該遵循這個標準。當然,所有現代查詢工具都將生成ANSI-92。
  • 正如@GBN所指出的,它確實可以避免偶然的交叉連接。

我本人抵制ANSI-92有一段時間了,因為舊語法在概念上有一點優勢,因為可以更容易地將SQL設想為所有使用的表的大規模笛卡兒連接,然后是過濾操作-這是一種可以幫助理解SQL查詢正在做什么的腦力技術。然而,幾年前,我決定我需要與時俱進,經過一段相對較短的調整期后,我現在非常喜歡它-主要是因為上面給出的第一個原因。唯一應該偏離ANSI-92語法,或者說不使用該選項的地方是自然連接,這是隱含的危險。


查看完整回答
1 反對 回復 2019-06-17
?
POPMUISE

TA貢獻1765條經驗 獲得超5個贊

第二個構造稱為SQL社區中的“固定連接語法”。第一個構造AFAIK沒有被廣泛接受的名稱,所以讓我們稱它為‘舊樣式’內部連接語法。

通常的爭論是這樣的:

“傳統”語法的優點:謂詞在物理上分組在WHERE子句,使查詢更容易閱讀和理解,這使得查詢更一般,尤其是n元關系更容易閱讀和理解(ON不固定語法的子句可以展開謂詞,因此您必須在可視距離上查找一個表或列的外觀)。

“傳統”語法的缺點:當省略其中一個“聯接”謂詞時沒有解析錯誤,其結果是笛卡兒乘積(稱為CROSS JOIN在不固定的語法中),這樣的錯誤很難檢測和調試。此外,“聯接”謂詞和“篩選”謂詞在WHERE子句,這會使它們彼此混淆。


查看完整回答
反對 回復 2019-06-17
?
翻翻過去那場雪

TA貢獻2065條經驗 獲得超14個贊

這兩個查詢相等-第一種是使用非ANSI連接語法,第二種是ANSI連接語法.我建議堅持使用ANSI連接語法。

是的,當您要加入的表可能不包含任何匹配記錄時,您想要使用的是左外部聯接(順便說一下,它也是ANSI連接語法)。

參考資料:SQL Server中的條件連接


查看完整回答
反對 回復 2019-06-17
  • 3 回答
  • 1 關注
  • 1197 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號