1

一見単純な問題を解決しようとしていますが、EXISTS キーワードがどのように機能するかについての理解につまずいていると思います。この問題は単純です (これは実際の問題の単純化されたバージョンです) - 私は学生のテーブルと趣味のテーブルを持っています。学生テーブルには、学生 ID と名前があります。同じ数の趣味を共有する学生のみを返します (つまり、趣味の数が一意である学生は表示されません)。

だから私が遭遇する難しさは、趣味の数を比較する方法を考え出すことです. 私が試したのはこれです。

SELECT sa.studentnum, COUNT(ha.hobbynum)
FROM student sa, hobby ha
WHERE sa.studentnum = ha.studentnum
AND EXISTS (SELECT *
            FROM student sb, hobby hb
            WHERE sb.studentnum = hb.studentnum 
            AND sa.studentnum != sb.studentnum
            HAVING COUNT(ha.hobbynum) = COUNT(hb.hobbynum)
           )
GROUP BY sa.studentnum
ORDER BY sa.studentnum;

そのため、hobbynum のカウントが各テストで同じであるため、同じ数の趣味に一致するテーブルだけでなく、元のテーブルがすべて返されるように見えます。

4

2 に答える 2

2

テストされていませんが、おそらく次のようなものです(問題を正しく理解していれば):

WITH h AS (
  SELECT studentnum, COUNT(hobbynum) OVER (PARTITION BY studentnum) student_hobby_ct
    FROM hobby)
SELECT studentnum, student_hobby_ct
  FROM h h1 JOIN h h2 ON h1.student_hobby_ct = h2.student_hobby_ct AND
                         h1.studentnum <> h2.studentnum;
于 2013-02-03T02:00:01.217 に答える
1

あなたのクエリが行うことは、同じ数の趣味を持つ他の生徒が少なくとも 1 人いる生徒のみを返すことだと思います。しかし、一致する学生については何も返していません。それは意図的なものですか?カウントの結合の前に、両方のクエリをサブクエリと集計として扱います。いくつかのことができます...ここでは、趣味の数が一致する学生の数を返していますが、 HAVING(COUNT(distinct sb.studentnum) = 0 を制限して、クエリが返すように見える結果を取得できます...

with xx as 
(SELECT sa.studentnum, count(ha.hobbynum) hobbycount
            FROM student sa inner join hobby ha
            on sa.studentnum = ha.studentnum
            group by sa.studentnum
           )
select sa.studentnum, sa.hobbycount, count(distinct sb.studentnum) as matchcount
from
xx sa inner join xx sb on 
    sa.hobbycount = sb.hobbycount
where
    sa.studentnum != sb.studentnum
GROUP by sa.studentnum, sa.hobbycount
ORDER BY sa.studentnum;
于 2013-02-03T02:10:15.843 に答える