2017-12-12 4 views
1

データベースの設計に問題があります。次の問題の解決策を見つけるためにテーブルを照会する必要があります。SQL Serverの2つのクエリの違いを取得する

私はこのようなテーブルを持っているとしましょう。

+------------+------------+--------------+-----------+ 
|  id  | SubCode | Type   | NumId  | 
+----------------------------------------------------+ 
|  1  | SB1212  | TCH   | 100000000 | 
|  1  | SB1212  | APP   | 100000000 | 
|  1  | SB1212  | TCH   | 100000001 | 
|  1  | SB1212  | APP   | 100000002 | 
+----------------------------------------------------+ 

私はだけが(彼らは=「APP」とタイプに属するべきではありません)タイプ=「TCH」に属している人々のNumIdを見つける必要があります。

NumIdは複製可能であることに注意してください。

次のクエリを書きましたが、ロードに時間がかかりすぎています。これは簡単な問題のように見えますが、私は解決策が見えないほど長くこれを試しています。誰かが私が間違っているところを私に指摘できますか?

SELECT NumId 
FROM TeacherSubject 
WHERE SubCode = 'SB1212' 
    AND Type = 'TCH' OR Type = 'APP' 
    AND id NOT IN (SELECT NumId FROM TeacherSubject 
       WHERE SubCode = 'SB1212' 
        AND Type = 'APP') 
ORDER BY NumId DESC 

私は期待していた出力は、です。 はTCHとAPPタイプに属しているためです。

+0

を使用すると 'TCH' – Petaflop

答えて

3

あなたがタイプ= 'TCH' がそれらすべてを選択することができCTE

with cte as (
select * 
    from TeacherSubject 
where [Type] = 'APP' 
    and Subcode = 'SB1212' 
) 
select NumID 
    from TeacherSubject 
where [Type] = 'TCH' 
    and Subcode = 'SB1212' 
    and NumID not in (select NumID from cte) 
order by NumID desc 
+0

これはかなりきれいで、魅力的です。私の時間を保存してくれてありがとう。 – Fawzan

1

これは

SELECT 
    NumId 
    FROM YourTable YT 
     WHERE [Type] = 'TCH' 
AND SubCode = 'SB1212' 
       AND NOT EXISTS 
       (
        SELECT 
         1 
         FROM YourTable 
          WHERE NumId = YT.NumId 
           AND [Type] <> YT.[Type] 
AND [SubCode] = YT.SubCode 
       ) 
+0

タイプ<>を持つもので、 'except'を使用することができます試してみてくださいサブコードを追加すると、あなたのソリューションは機能します。 +1 – Fawzan

+0

@Fawzanこれを今すぐチェックすると、より速く動作します –

関連する問題