1

DB2 で実行しているクエリ

select  yrb_customer.name, 
        yrb_customer.city, 
        CASE count(*) WHEN 0 THEN 0 ELSE count(*) END as #UniClubs 
from  yrb_member, yrb_customer 
where yrb_member.cid = yrb_customer.cid and yrb_member.club like '%Club%' 
group by yrb_customer.name, yrb_customer.city  order by count(*)

「Club」という単語が含まれるクラブに所属している人が表示さ#UniClubsれ、名前と市区町村とともに、そのようなクラブの数 ( ) が表示されます。ただし、そのようなクラブに所属していない学生には、まだ表示してもらいたいのですが、現在起こっている非表示にする代わりに 0 にしてください。でこの機能を取得できませんcount(*)。誰かが光を当てることができますか?上記が十分に明確でない場合は、さらに説明できます。

4

2 に答える 2

1

あなたが欲しいと思うでしょうLEFT JOIN

SELECT yrb_customer.name, yrb_customer.city,
       COUNT(yrb_member.club) as clubCount
FROM yrb_customer
LEFT JOIN yrb_member
       ON yrb_member.cid = yrb_customer.cid
          AND yrb_member.club LIKE '%Club%
GROUP BY yrb_customer.name, yrb_customer.city
ORDER BY clubCount

また、タプル ( yrb_customer.name, yrb_customer.city) が一意である場合 (または、同じ人物と同じ名前のすべての学生を数えていますか?)、次の方法でより良いパフォーマンスが得られる可能性があります。

SELECT yrb_customer.name, yrb_customer.city,
       COALESCE(club.count, 0)
FROM yrb_customer
LEFT JOIN (SELECT cid, COUNT(*) as count
           FROM yrb_member
           WHERE club LIKE '%Club%
           GROUP BY cid) club
       ON club.cid = yrb_customer.cid
ORDER BY club.count

元の結果が隠されている理由は、元のクエリに暗黙的な内部結合があり、もちろん一致する行が必要なためです。暗黙的な結合構文 (コンマ区切りFROM句) は、内部 (通常の) 結合には適していますが、本当に必要だった左結合には適していません。暗黙的な結合構文 (および句内の特定のタイプの関連するフィルタリングWHERE) の使用は、非推奨と見なされます。

于 2013-04-08T22:30:42.620 に答える