我有桌子
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,其具有CLOSE中的所有T3记录,而W2具有T3记录。 此外,1002有W4记录,没有T3记录。 所以他们必须被选中。
1001不能是selecet因为它有W3记录,所有T3记录都没有CLOSEd。 也不能选择1003,因为它具有W5,所有T3记录都没有关闭。
这对我来说有点棘手。
谢谢
答案 0 :(得分:0)
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
写在平板电脑上,请原谅/更正大写。
答案 1 :(得分:0)
所以你想要来自T1的所有记录,其中只有闭合的T3记录,或者没有T3记录,其中T3通过T2链接到T1。相反,您希望所有T1记录都超过那些具有非封闭T3记录的记录。
以两种方式表达它可以提供不同的方式来编写相同的查询。例如,你可以做
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告诉您哪一个更有效 - 他们最终可能会使用相同的查询计划执行。
(未经测试,但我认为上面的语法还可以)