繁体   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