2012-04-11 50 views
2

我碰到以下SQL聲明,我想知道,如果它是有效的:無JOIN的有效SQL?

SELECT COUNT(*) 
    FROM 
     registration_waitinglist, 
     registration_registrationprofile 
    WHERE 
     registration_registrationprofile.activation_key = "ALREADY_ACTIVATED" 

什麼用逗號分隔的兩個表是什麼意思?

+0

這就是所謂的*隱式連接* – 2012-04-11 19:21:13

回答

7

當您從多個表中獲取數據時,您可以從這些表中獲得所有元組的Cartesian Product。它可以通過以下方式來說明:

Cartesian product illustration

這意味着從第二個表中的所有行配對的第一個表中獲取每一行。大多數時候,這不是你想要的。如果你真的想要的話,那麼它更清晰使用CROSS JOIN符號:

SELECT * FROM A CROSS JOIN B; 
+0

不錯的圖片:)不過,請注意「[笛卡爾產品]類比有點鬆散,因爲在笛卡爾積中,配對元素保持爲一對,而JOIN將它們組合成單個元組。」 - Hugh Darwen,An關係數據庫理論簡介。 – onedaywhen 2012-04-12 07:59:39

2

在這種情況下,這意味着你將要由registration_waitinglist在registration_registrationprofile

加入每一行每一行這就是所謂的笛卡爾加入

+0

謝謝,是有寫上面的說法更加明確/冗長的方法嗎? – David542 2012-04-11 19:20:52

+0

這實際上取決於你想要實際做什麼。如果你想要從一張表中的每行到另一張表中的每一行,這是實現它的唯一方法。 – 2012-04-11 19:22:50

+3

明確這將是:SELECT ... FROM registration_waitinglist CROSS JOIN registration_registrationprofile .. – PepperBob 2012-04-11 19:23:54

1

查詢是「語法」是正確的,這意味着它會跑。查詢將返回的是registration_waitinglist x registration_registrationprofile中每行的完整產品。 例如,如果等候名單中有2行,而配置文件中有3行,則將返回6行。

從實際的情況來看,這幾乎總是一個邏輯錯誤而不是意圖。除了罕見的例外情況,應該在where子句中加入標準或條件。