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