Sql 相关子查询的结果不正确

Sql 相关子查询的结果不正确,sql,Sql,我的任务是: 查找只在同一年级有朋友的学生的姓名和年级 我的桌子: 高中生 朋友 我的问题是: 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 highschool

我的任务是: 查找只在同一年级有朋友的学生的姓名和年级

我的桌子:

高中生 朋友 我的问题是:

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
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
我的相关子查询有问题。
你能给我一个提示吗?

要让学生只在自己的年级有朋友,而没有其他朋友,请尝试以下方法:

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)
这是我的答案


祝你好运。

我会使用TDQD——测试驱动的查询设计——来解决这个问题

确定某个高中生朋友的分数 这列出了每个朋友的高中生的朋友、高中生的成绩和朋友的成绩

生成一个学生列表,列出他们的朋友不在自己的年级 生成至少有一个朋友但没有不在其年级的朋友的学生列表 这将选择出现在朋友表id1列中的高中生;他们至少列出了一个朋友,而且他们的每个朋友都在同一年级

生成一个没有不在其年级的朋友的学生列表 这将选择没有出现在好友表id1列中的高中生;他们没有列出任何朋友,也没有输入任何数据,而是非常孤独,因此他们的朋友中没有一个处于不同的年级

注意,所有这些查询都假设学生B不一定因为学生A将学生B列为朋友而将学生A列为朋友。也就是说,如果条目1234、2345出现在朋友表中,说明学生1234认为2345是朋友,则它不会自动跟随2345认为1234是朋友;必须有一个明确的逆向条目23451234来表示互惠关系。如果友谊被自动回复,查询会变得更加复杂。

这是有效的:

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"

这肯定有效,我已经试过运行它

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

非常感谢。但不幸的是,这不是我需要的。这将不会返回正确的结果。请查看编辑-了解不存在-将WHERE H.ID not IN更改为WHERE not EXISTS,这应该会做同样的事情。让我创建一个测试小提琴…不,你的查询返回所有高中生。不幸的是,没有工作。好的-请看编辑-这里是小提琴:工作。但我不明白我的变种有什么问题。
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)
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;
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
       )
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
       )
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"
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