我的任务是: 查找只有同一年级朋友的学生的姓名和成绩。
我的桌子:
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
我用蒂芙尼仔细检查我的代码:
1381 Tiffany 9 1247 Alexis 11
1381 Tiffany 9 1510 Jordan 9
我的相关子查询有问题。 你能给我一个关于错误的暗示吗?
答案 0 :(得分:0)
要让只有年级朋友并且没有其他朋友的学生,请尝试以下方法:
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)
这是SQL Fiddle。
祝你好运。答案 1 :(得分: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;
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
)
这将选择出现在Friends表的id1
列中的高中生;他们至少列出了一个朋友,他们的每个朋友都在同一年级。
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
)
这将选择没有出现在Friends表的id1
列中的高中生;他们没有列出朋友(可能是数据未输入而不是非常孤独)所以他们的朋友中没有一个人处于不同的等级。
请注意,所有这些查询都假设学生B不一定将学生A列为朋友,因为学生A将学生B列为朋友。也就是说,如果条目(1234,2345)出现在朋友表中(说明学生1234认为2345是朋友),则它不会自动跟随2345认为1234是朋友;必须有一个明确的反向条目(2345,1234)来表示互惠关系。如果友谊被自动回复,查询会变得更加复杂。
答案 2 :(得分: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"
答案 3 :(得分: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