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