0

以下のクエリは機能しますが、私が読んだことによると、結果を取得する最も効率的な方法ではありませんOR。またはJOINを使用する必要があると思いますが、それを達成する方法がわかりません。誰かが私の結果を得るために「適切な」ものを説明できますか?UNIONINTERSECT

WITH CTE1 AS (SELECT SC, SN, COUNT(AL) AS UNEXCUSED 
              FROM ATT 
              WHERE AL = 'U' 
              GROUP BY SC, SN),
     CTE2 AS (SELECT SC, SN, COUNT(AL) AS SUSPENDED 
              FROM ATT 
              WHERE AL = 'S' 
              GROUP BY SC, SN) 
SELECT STU.ID, STU.SC, STU.SN, 
       ISNULL(CTE1.UNEXCUSED, '') AS UNX,
       ISNULL(CTE2.SUSPENDED, '') AS SUS 
FROM CTE2
FULL JOIN CTE1 
       ON CTE1.SC = CTE2.SC 
          AND CTE1.SN = CTE2.SN
JOIN STU 
  ON (CTE1.SC = STU.SC 
      AND CTE1.SN = STU.SN) 
     OR (CTE2.SC = STU.SC 
         AND CTE2.SN = STU.SN)
WHERE STU.SC IN (1,2,4,9,11,15)

これは出力のサンプルです:

ID      SC  SN     UNX  SUS
4291432 15  602    0    8
4296250 15  688    6    3
4216462 15  695    0    12
4916602 15  623    0    2
4295193 1   150    1    0
4215874 2   216    1    0
4005707 15  297    1    0

ありがとうございました。

4

1 に答える 1

0

個人的には、クエリを次のように変更します。

WITH CTE1 AS (SELECT SC, SN, COUNT(AL) AS UNEXCUSED 
              FROM ATT 
              WHERE AL = 'U' 
              GROUP BY SC, SN),
     CTE2 AS (SELECT SC, SN, COUNT(AL) AS SUSPENDED 
              FROM ATT 
              WHERE AL = 'S' 
              GROUP BY SC, SN) 
SELECT STU.ID, STU.SC, STU.SN, 
       ISNULL(CTE1.UNEXCUSED, '') AS UNX,
       ISNULL(CTE2.SUSPENDED, '') AS SUS 
FROM STU
LEFT JOIN CTE1
       ON (CTE1.SC = STU.SC 
           AND CTE1.SN = STU.SN) 
LEFT JOIN CTE2 
       ON (CTE2.SC = STU.SC 
           AND CTE2.SN = STU.SN)
WHERE STU.SC IN (1,2,4,9,11,15)

....それ以外の理由がなければ、意図した結果がもう少し明確になります。オプティマイザは同じ説明計画を生成する場合があることに注意してください。

于 2013-05-14T00:06:42.017 に答える