3 回答

TA貢獻1810條經驗 獲得超5個贊
交叉聯接產生的結果由兩個或多個表中的行的每種組合組成。這意味著如果表A有6行,表B有3行,則交叉連接將導致18行。在兩個表之間沒有建立關系-實際上,您只是產生每種可能的組合。
通過內部聯接,將表的一行的列值與另一(或同一)表的另一行的列值組合在一起,以形成單行數據。
如果將WHERE子句添加到交叉聯接中,則由于WHERE施加了限制因素,因此它充當內部聯接。
只要您的查詢遵守常識和特定于供應商的性能準則,我就認為將使用哪種類型的連接的決定簡單地考慮進去。

TA貢獻1895條經驗 獲得超7個贊
我發現,允許第一種語法(用逗號分隔的表)的工作場所往往會花費大量時間來調試情況,這些情況下返回的行比預期的多。意外的交叉聯接是系統的禍根,甚至可以使最優化的數據庫癱瘓。去年,它至少使我們的pre-prod系統停止了兩次。
第二種語法(聯接語法)迫使編寫者首先考慮如何將表聯接在一起,然后僅返回感興趣的行。使用該語法意外地進行交叉聯接是不可能的,因此減少了意外地執行不良查詢的危險。
但是,除了這個問題之外,我從來沒有注意到我所擁有的任何系統中兩種語法之間的速度差異。

TA貢獻1796條經驗 獲得超7個贊
第一個示例在功能上與第二個示例相同。但是,出于多種原因,應避免使用此語法。首先,使用這種語法時,意外地獲得交叉聯接要容易得多,尤其是當表中存在多個聯接時。如果您看到很多這種類型的查詢都帶有關鍵字“ distinct”,則可能有人試圖修復交叉連接。
接下來,不贊成使用較舊樣式的左右聯接語法,并且將不再支持該語法。此外,它現在仍然無法正常工作。有時,它會誤解外部聯接并發回錯誤的結果集。因此,您在where子句中使用=或=的所有查詢都應立即替換。
第三,ANSI標準聯接更易于理解和維護。對聯接的理解是任何查詢任何關系數據庫所需的最關鍵的基本技能之一。我的經驗是,一些使用較舊樣式的人并不真正理解聯接及其工作方式,因此編寫的查詢實際上并沒有達到他們的預期目的。
添加回答
舉報