[英]where clause conditions in SQL
下面是一個基於 where 子句的連接:
SELECT a.* FROM TEST_TABLE1 a,TEST_TABLE2 b,TEST_TABLE3 c
WHERE a.COL11 = b.COL11
AND b.COL12 = c.COL12
AND a.COL3 = c.COL13;
我一直在從在線資源中學習 SQL 並嘗試使用連接進行轉換
兩個問題:
(+)
后綴)與最后一個where
條件無關。 由於這種情況,查詢應該只返回存在實際匹配c
記錄的記錄。 因此,原始查詢與沒有此類(+)
后綴相同。TEST_TABLE3
兩次,而第一個查詢只加入了一次,並且有兩個條件決定了它是如何加入的。 您不應將這些條件拆分為兩個單獨的連接。順便說一句,令人驚訝的是 SQL Fiddle 站點沒有顯示錯誤,因為兩次使用相同的別名是沒有意義的。 例如,請參閱 MySQL 如何使用dbfiddle上的相同查詢返回錯誤(在所有可用版本的 MySQL 上):
不是唯一的表/別名:'C'
因此,要使用標准join
表示法獲得相同的結果,所有連接都應該是inner
連接:
SELECT *
FROM TEST_TABLE1 A
INNER JOIN TEST_TABLE2 B
ON A.COL11 = B.COL11
INNER JOIN TEST_TABLE3 C
ON A.COL11 = B.COL11
AND B.COL12 = C.COL12;
@tricot 正確地指出,擁有 2 個具有相同名稱的別名並且沒有出現錯誤是很奇怪的。 另外,回答您的問題:在第一個查詢中,我們首先通過指定所有表名來在所有 3 個表之間執行交叉連接。 之后,我們使用執行交叉連接后得到的 output 上的WHERE子句中指定的條件過濾行。 在第二個查詢中,您只需加入test_table3
一次。 由於現在您擁有所有必需的別名 A、B、C,就像在第一個查詢中一樣,因此您可以在最后一次連接后指定 2 個條件,如下所示:
SELECT A.* FROM TEST_TABLE1 A
LEFT JOIN TEST_TABLE2 B
ON A.COL11 = B.COL11
left join TEST_TABLE3 C
on B.COL12 =C.COL12 AND A.COL3 = C.COL13;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.