簡體   English   中英

SQL 中的 where 子句條件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM