簡體   English   中英

SQL SELECT表達式-在3個表之間進行選擇

[英]SQL SELECT expression- select between with 3 tables

我有桌子

T1:

T1ID

1000
1001
1002
1003

T2:

T2ID     T1ID

W1       1000
W2       1000
W3       1001
W4       1002
W5       1003

T3:

T3ID   STATUS   T2ID

T1     CLOSE    W1
T2     CLOSE    W1
T3     INPRG    W3
T4     INPRG    W3
T5     CLOSE    W5
T6     INPRG    W5

我想使表達式僅從T1獲得1000和1002。 作為T1選擇的結果,我想獲取以下記錄:T2中具有T2記錄,而所有T3記錄都處於CLOSE狀態,或者T2記錄根本沒有T3記錄。

因此1000有W1,其中W1具有所有CLOSE中的T3記錄,W2沒有W3記錄。 同樣1002具有W4記錄,而沒有T3記錄。 因此必須選擇它們。

不能選擇1001,因為它具有未關閉所有T3記錄的W3記錄。 也不要選擇1003,因為它具有W5,但尚未關閉所有T3記錄。

對我來說,這有點棘手。

謝謝

Select distinct t1.id
From   t1
       Inner join
       T2 on t1.id=t2.t1id
       Left join
       (Select t3.t3id 
        from T3 
        where t3.status <> 'CLOSE') t3a on t3a.t3id=t2.t3id and t3.t3id is null

寫在平板電腦上,請原諒/更正大寫。

因此,您需要來自T1的所有記錄,其中只有關閉的T3記錄,或者沒有T3記錄,其中T3通過T2鏈接到T1。 相反,除了那些未關閉的T3記錄,您都希望所有T1記錄。

兩種方式都表達它可以提供不同的方式來編寫相同的查詢。 例如你可以

SELECT t1.id
FROM t1
where not exists(
  select * 
  from t2
    inner join t3
      on t2.id = t3.t2id
  where t3.status <> 'CLOSE'
  )

或者你可以做

select t1.id
from t1
EXCEPT
select t1.id
from t1
  inner join t2
    on t1.id = t2.t1id
  inner join t3
    on t2.id = t3.t2id
where t3.status <> 'CLOSE'

您可以要求SQL Server Management Studio告訴您哪個效率更高-他們最終可能會以相同的查詢計划執行。

(未經測試,但我認為上面的語法還可以)

暫無
暫無

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

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