我碰到以下SQL
聲明,我想知道,如果它是有效的:無JOIN的有效SQL?
SELECT COUNT(*)
FROM
registration_waitinglist,
registration_registrationprofile
WHERE
registration_registrationprofile.activation_key = "ALREADY_ACTIVATED"
什麼用逗號分隔的兩個表是什麼意思?
我碰到以下SQL
聲明,我想知道,如果它是有效的:無JOIN的有效SQL?
SELECT COUNT(*)
FROM
registration_waitinglist,
registration_registrationprofile
WHERE
registration_registrationprofile.activation_key = "ALREADY_ACTIVATED"
什麼用逗號分隔的兩個表是什麼意思?
當您從多個表中獲取數據時,您可以從這些表中獲得所有元組的Cartesian Product
。它可以通過以下方式來說明:
這意味着從第二個表中的所有行配對的第一個表中獲取每一行。大多數時候,這不是你想要的。如果你真的想要的話,那麼它更清晰使用CROSS JOIN
符號:
SELECT * FROM A CROSS JOIN B;
不錯的圖片:)不過,請注意「[笛卡爾產品]類比有點鬆散,因爲在笛卡爾積中,配對元素保持爲一對,而JOIN將它們組合成單個元組。」 - Hugh Darwen,An關係數據庫理論簡介。 – onedaywhen 2012-04-12 07:59:39
在這種情況下,這意味着你將要由registration_waitinglist在registration_registrationprofile
加入每一行每一行這就是所謂的笛卡爾加入
查詢是「語法」是正確的,這意味着它會跑。查詢將返回的是registration_waitinglist x registration_registrationprofile中每行的完整產品。 例如,如果等候名單中有2行,而配置文件中有3行,則將返回6行。
從實際的情況來看,這幾乎總是一個邏輯錯誤而不是意圖。除了罕見的例外情況,應該在where子句中加入標準或條件。
這就是所謂的*隱式連接* – 2012-04-11 19:21:13