SQL SELECT表达式 - 在3个表之间进行选择

时间:2012-12-03 10:11:56

标签: sql select

我有桌子

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记录都没有关闭。

这对我来说有点棘手。

谢谢

2 个答案:

答案 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告诉您哪一个更有效 - 他们最终可能会使用相同的查询计划执行。

(未经测试,但我认为上面的语法还可以)

相关问题