簡體   English   中英

左外連接的SQL where子句

[英]SQL where clause for left outer join

我對要創建的視圖有疑問。 我在左外連接中連接了兩個表,比如tableAtableB ,其中tableB是外連接的。

我想只選擇表B中狀態等於4的那些行,所以我將WHERE state = 4添加到我的查詢中。 現在,因為沒有匹配的行所有行的結果集進行修剪頗有幾分tableB是從結果中刪除(因為狀態不是4對那些行)。 我也試過WHERE state = 4 OR state IS NULL ,不工作或者(因為state技術上是不是NULL的時候沒有狀態)。

所以我需要的是一個WHERE語句,它僅在實際存在行時進行求值,是否存在這樣的事情?

如果沒有,我看到兩個選項: join (SELECT * FROM tableB WHERE state = 4)而不是表B,或者創建一個具有相同WHERE語句的視圖並將其連接起來。 明智的選擇是什么?

順便說一句,這是SQL Server 2008 R2。

您將條件放在on子句中。 例:

select a.this, b.that
from TableA a
left join TableB b on b.id = a.id and b.State = 4

您可以將state = 4添加到連接條件。

select * 
from T1
  left outer join T2
    on T1.T1ID = T2.T1ID and
       T2.state = 4

比子查詢更容易擴展on子句,比如;

select  *
from    TableA a
left    join
        TableB b
on      a.b_id = b.id
        and b.state = 4

將顯示TableA中的所有行,並且僅顯示具有狀態4的TableB中的行。

SQL Server將可能執行的觀點,擴大on以完全相同的方式,和子查詢。 所以表現明智,應該沒什么區別。

替代方法:(1)內部連接到表B,其中狀態等於4,(2)反連接到表B以查找不存在的行,(3)結合結果:

SELECT A1.ID, A1.colA, B1.ColB
  FROM tableA AS A1
       INNER JOIN tableB AS B1
          ON A1.ID = B1.ID
             AND B1.state = 4
UNION
SELECT A1.ID, A1.colA, '{{MISSING}}' AS ColB
  FROM tableA AS A1
 WHERE NOT EXISTS (
                   SELECT * 
                     FROM tableB AS B1
                     WHERE A1.ID = B1.ID
                  );

或者:

SELECT A1.ID, A1.colA, B1.ColB
  FROM tableA AS A1
       JOIN tableB AS B1
          ON A1.ID = B1.ID
             AND B1.state = 4
UNION
SELECT ID, colA, '{{NA}}' AS ColB
  FROM tableA 
 WHERE ID IN (
              SELECT ID
                FROM tableA
              EXCEPT 
              SELECT ID
                FROM tableB
             );

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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