0

私は 2 つのテーブルを持ってMainDetailsます。それらは 1 対多の関係にあり、1 つの行が にMain複数の行を持つ可能性がありますDetails

Mainからのすべての情報に加えて、関連する行にDetails一連のコードのいずれかが含まれているかどうかを返すクエリを作成しようとしています。もちろん、これは 1 対多であるため、複数のコードが存在する可能性がありDetailsます。また、行を二重にカウントしたくありません。私もそれを数回繰り返す必要があります。

私が欲しいのは次のようなものです:

SELECT m.*, CASE WHEN x.ID IS NOT NULL THEN 1 ELSE 0 END AS Codes1, CASE WHEN y.ID IS NOT NULL THEN 1 ELSE 0 END AS Codes2
FROM [Main] m
LEFT JOIN EXISTS(SELECT d.ID FROM [Details] d WHERE m.ID = d.ID AND d.Code IN (<<Codes1>>)) x
LEFT JOIN EXISTS(SELECT d.ID FROM [Details] d WHERE m.ID = d.ID AND d.Code IN (<<Codes2>>)) y

これを行う方法はありますか?(これは明らかなはずのことのようで、n 度まで複雑にしていますが、本当に空白を描いています...

4

3 に答える 3

2

クエリからを削除し、EXISTSを追加しますDISTINCT

SELECT DISTINCT
   m.*, 
   CASE WHEN x.ID IS NOT NULL THEN 1 ELSE 0 END AS Codes1, 
   CASE WHEN y.ID IS NOT NULL THEN 1 ELSE 0 END AS Codes2 
FROM [Main] m 
LEFT JOIN (SELECT d.ID FROM [Details] d WHERE m.ID = d.ID AND d.Code IN (<<Codes1>>)) x 
LEFT JOIN (SELECT d.ID FROM [Details] d WHERE m.ID = d.ID AND d.Code IN (<<Codes2>>)) y 
于 2012-09-05T08:10:22.773 に答える
0

私はこれがうまくいくと思います:

SELECT  M.*, 
        CASE WHEN C1.Codes IS NULL THEN 0 ELSE 1 END as Codes1,
        CASE WHEN C2.Codes IS NULL THEN 0 ELSE 1 END as Codes2
FROM    Main M
LEFT
JOIN    
(
    SELECT  d.Id,
            COUNT(d.Code) as Codes
    FROM    Details d
    WHERE   d.Code in (<<Codes1>>)
    GROUP 
    BY      d.Id
) C1
    ON C1.Id = M.Id
LEFT
JOIN    
(
    SELECT  d.Id,
            COUNT(d.Code) as Codes
    FROM    Details d
    WHERE   d.Code in (<<Codes2>>)
    GROUP 
    BY      d.Id
) C2
    ON C2.Id = M.Id

M. *が必要ない場合は、次の方がよいでしょう。

SELECT  M.Id, 
        SUM(CASE WHEN D1.Id IS NULL THEN 0 ELSE 1 END) AS Codes1Count,
        SUM(CASE WHEN D2.Id IS NULL THEN 0 ELSE 1 END) AS Codes2Count
FROM    Main M
LEFT
JOIN    Details D1
        ON  D1.Id = M.Id 
        AND D1.Code in (<<Codes1>>)
LEFT
JOIN    Details D2
        ON  D2.Id = M.Id 
        AND D2.Code in (<<Codes2>>)
GROUP 
BY      M.Id
于 2012-09-05T07:11:35.283 に答える
0

これは、あなたが望むものを得るスリムなバージョンのコードです

SELECT abb1.*, abb2.mycount 
FROM Main AS abb1
    JOIN (SELECT Main.ID, COUNT(Details.ID) AS mycount
         FROM Main 
            JOIN Details on Details.ID = Main.ID
         GROUP BY Main.ID) AS abb2
于 2012-09-05T14:10:20.327 に答える