我有几个表( 粗体 表示主键):
Dancer(dancer_name, gender, age)
Dance(dancer_name, dvd_id, song_title)
Dvd(dvd_id, song_title, cost)
Song(dancer_name, song_title, genre)
Launch(dancer_name, dvd_id, year)
我想选择歌曲一起出现在一张或多张 DVD 中的舞者对,并且每对舞者只打印一次。
这是我所能得到的最接近的结果,它两次打印出相同的对,但它们的名称在不同的列中:
select distinct DANCER1.dancer_name, DANCER2.dancer_name, count(*) as count
from Dancer DANCER1, Dancer DANCER2, Dance DANCE1, Dance DANCE2
where DANCER1.dancer_name = DANCE1.dancer_name
and DANCER2.dancer_name = DANCE2.dancer_name
and DANCER1.dancer_name <> DANCER2.dancer_name
and DANCE1.dvd_id = DANCE2.dvd_id
group by DANCER1.dancer_name, DANCER2.dancer_name;
所以,而不是得到 Tom Jon
Jon Tom
Bob Sam
Sam Bob
我只想Tom Jon
Bob Sam
最佳答案
如果您将测试从 DANCER1.dancer_name <> DANCER2.dancer_name
更改为至 DANCER1.dancer_name < DANCER2.dancer_name
,你应该得到你想要的结果。
但是,由于您在 Dance 表中使用名称作为键,因此不需要加入 Dancer 表,查询可能会简化为:
SELECT DANCE1.dancer_name, DANCE2.dancer_name, count(*) as count
FROM Dance DANCE1
INNER JOIN Dance DANCE2
ON DANCE1.dvd_id = DANCE2.dvd_id
WHERE DANCE1.dancer_name < DANCE2.dancer_name
GROUP by DANCE1.dancer_name, DANCE2.dancer_name
关于SQL:假设只有两个列,如何比较不同行中的数据并仅选择唯一的 "pairs"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14870268/