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 select の結果として、T2 にすべての T3 レコードが CLOSE ステータスにある T2 レコードがあるレコード、または T2 レコードに T3 レコードがまったくないレコードを取得したいと考えています。

したがって、1000 には、CLOSE にすべての T3 レコードがある W1 と、T3 レコードがない W2 があります。また、1002 には、T3 レコードを持たない W4 レコードがあります。したがって、それらを選択する必要があります。

1001 は、すべての T3 レコードが CLOSE されていない W3 レコードがあるため、選択しないでください。1003 も、すべての T3 レコードが閉じられていない W5 があるため、選択してはなりません。

私には少しトリッキーです。

ありがとうございました

4

2 に答える 2

0

したがって、クローズされた T3 レコードのみが存在する T1 からのすべてのレコード、または T3 が T2 を介して T1 にリンクされている T3 レコードが存在しないすべてのレコードが必要です。逆に、クローズされていない 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 に問い合わせることができます。同じクエリ プランで実行される可能性があります。

(テストされていませんが、上記の構文は問題ないと思います)

于 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 に答える