-1

私の仕事は、同じ学年の友達しかいない生徒の名前と学年を見つけることです。

私のテーブル:

高校生

ID  name    grade
1510    Jordan  9
1689    Gabriel 9
1381    Tiffany 9
1709    Cassandra   9
1101    Haley   10
1782    Andrew  10
1468    Kris    10
1641    Brittany    10
1247    Alexis  11
1316    Austin  11
1911    Gabriel 11
1501    Jessica 11
1304    Jordan  12
1025    John    12
1934    Kyle    12
1661    Logan   12

友達

ID1 ID2
1510    1381
1510    1689
1689    1709
1381    1247
1709    1247
1689    1782
1782    1468
1782    1316
1782    1304
1468    1101
1468    1641
1101    1641
1247    1911
1247    1501
1911    1501
1501    1934
1316    1934
1934    1304
1304    1661
1661    1025
1381    1510
1689    1510
1709    1689
1247    1381
1247    1709
1782    1689
1468    1782
1316    1782
1304    1782
1101    1468
1641    1468
1641    1101
1911    1247
1501    1247
1501    1911
1934    1501
1934    1316
1304    1934
1661    1304
1025    1661

私のクエリ:

select name, grade from highschooler
where id in
(  select distinct id1 
   from friend out
   where not exists
     (select id1
      from friend
      where    
          (select grade from highschooler where id = out.id1) <>
          (select grade from highschooler where id = out.id2)
     )
)

私の結果:

Jordan  9
Gabriel 9
Tiffany 9
Cassandra   9
Haley   10
Andrew  10
Kris    10
Brittany    10
Alexis  11
Gabriel 11
Jessica 11
Jordan  12
John    12
Kyle    12
Logan   12

予想されるクエリ結果:

Jordan  9
Brittany    10
Haley   10
Kris    10
Gabriel 11
John    12
Logan   12

Tiffany でコードを精査します。

1381    Tiffany 9   1247    Alexis  11
1381    Tiffany 9   1510    Jordan  9

相関サブクエリに問題があります。何が間違っているのかヒントを教えていただけますか?

4

4 に答える 4

0

これは確かに機能します、私はそれを実行しようとしました...

Select distinct h1.name,h1.grade  
From Highschooler h1,Highschooler h2,Friend
Where h1.ID = Friend.ID1
AND h2.ID = Friend.ID2
AND h1.grade = h2.grade

EXCEPT
Select distinct h1.name,h1.grade
From Highschooler h1,Highschooler h2,Friend
Where h1.ID = Friend.ID1
AND h2.ID = Friend.ID2
AND h1.grade <> h2.grade
order by h1.grade,h1.name
于 2013-02-04T12:44:01.173 に答える
0

これを解決するには、TDQD (テスト駆動クエリ設計) を使用します。

特定の高校生の友達の成績を決定する

SELECT f.id1 AS h1_id, h1.grade AS h1_grade, h2.grade AS h2_grade
  FROM Friends AS f
  JOIN Highschoolers AS h1 ON f.id1 = h1.id
  JOIN Highschoolers AS h2 ON f.id2 = h2.id

これは、友人ごとに、その友人の高校生、高校生の学年、および友人の学年をリストします。

同学年以外の友達がいる生徒のリストを生成する

SELECT DISTINCT h1_id
  FROM (SELECT f.id1 AS h1_id, h1.grade AS h1_grade, h2.grade AS h2_grade
          FROM Friends AS f
          JOIN Highschoolers AS h1 ON f.id1 = h1.id
          JOIN Highschoolers AS h2 ON f.id2 = h2.id
       )
 WHERE h1_grade != h2_grade;

少なくとも 1 人の友達がいて、同学年以外の友達がいない生徒のリストを生成する

SELECT h.id, h.name, h.grade
  FROM Highschooolers AS h
  JOIN Friends AS f ON h.id = f.id1
 WHERE h.id NOT IN
       (SELECT DISTINCT h1_id
          FROM (SELECT f.id1 AS h1_id, h1.grade AS h1_grade, h2.grade AS h2_grade
                  FROM Friends AS f
                  JOIN Highschoolers AS h1 ON f.id1 = h1.id
                  JOIN Highschoolers AS h2 ON f.id2 = h2.id
               )
         WHERE h1_grade != h2_grade
       )

id1これにより、Friends テーブルの列に表示される高校生が選択されます。リストに少なくとも 1 人の友達がいて、すべての友達が同じ学年です。

同学年以外の友達がいない生徒のリストを生成する

SELECT h.id, h.name, h.grade
  FROM Highschooolers AS h
 WHERE h.id NOT IN
       (SELECT DISTINCT h1_id
          FROM (SELECT f.id1 AS h1_id, h1.grade AS h1_grade, h2.grade AS h2_grade
                  FROM Friends AS f
                  JOIN Highschoolers AS h1 ON f.id1 = h1.id
                  JOIN Highschoolers AS h2 ON f.id2 = h2.id
               )
         WHERE h1_grade != h2_grade
       )

id1これにより、Friends テーブルの列に表示されない高校生が選択されます。友人がリストされていないため (非常に孤独であるというよりは、おそらくデータが入力されていない可能性があります)、友人の 1 人も別の学年ではありません。

これらのすべてのクエリは、学生 A が学生 B を友人としてリストしているからといって、学生 B が学生 A を友人としてリストしているわけではないことを前提としていることに注意してください。つまり、エントリ (1234, 2345) がフレンド テーブルに表示された場合 (生徒 1234 が 2345 をフレンドと見なしていることを示す)、2345 が 1234 をフレンドと見なすとは自動的には従いません。相互関係を示すには、明示的な逆エントリ (2345、1234) が必要です。友情が自動的に往復する場合、クエリはより複雑になります。

于 2013-02-03T05:34:57.957 に答える
0

これは機能します:

select "name", "grade" from highschooler a
where not exists
(
  select 1 from (
(select id1, id2, count(distinct "grade") from (
SELECT *
FROM friend f, highschooler h
where f.id1 = h.id
or f.id2 = h.id
order by id1,id2)
group by id1, id2
having count(distinct "grade") > 1))
  where id1 = a.id or id2 = a.id)
order by "grade", "name"

上記のクエリの SQLFIDDLE

于 2013-02-03T05:35:42.107 に答える
0

To get only students who have friends in their grade and have no other friends, try this:

SELECT DISTINCT H.Id, H.Name, H.Grade
FROM HighSchooler H
  JOIN Friend F ON H.Id = F.ID1
  JOIN HighSchooler H2 ON F.ID2 = H2.ID AND H2.Grade = H.Grade
WHERE NOT EXISTS 
 (SELECT *
  FROM HighSchooler H3
  JOIN Friend F2 ON H3.Id = F2.Id1
  JOIN HighSchooler H4 ON F2.Id2 = H4.Id
  WHERE H4.Grade <> H.Grade AND H3.Id = H.Id)

And here is the SQL Fiddle.

Good luck.

于 2013-02-03T04:58:53.600 に答える