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