0

我有桌子

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 不能被选择,因为它有 W3 记录,所有 T3 记录都没有关闭。也不能选择 1003,因为它有 W5,所有 T3 记录都没有关闭。

这对我来说有点棘手。

谢谢

4

2 回答 2

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

(未经测试,但我认为上面的语法没问题)

于 2012-12-03T11:23:11.450 回答
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

写在平板电脑上,所以请原谅/更正大写。

于 2012-12-03T10:45:02.023 回答