4

我有一张桌子,上面有特定人的 id 和他喜欢的人的 id。

喜欢

(p1,p2)
id1,id2
id2,id1
id3,id4
id3 id5

预期产出

id1,id2

我必须删除重复项,这也意味着 id1,id2 要返回一次。

这是一道练习题。

select hh.id, hh.name, hh.grade as gr
     , hh.id2, kk.name, kk.grade as gr1
  from ( select id, id2, grade, name 
           from highschooler ab 
              , Likes cd 
          where ab.id = cd.id1 ) hh 
     , highschooler kk 
 where hh.id2 = kk.id

此查询返回类似这样的内容

学生id,学生姓名,学生成绩,朋友学生喜欢,朋友姓名,朋友成绩

4

2 回答 2

4

这应该让它自己加入:

SELECT p.p1, p.p2
FROM Likes p
    INNER JOIN Likes p2 ON 
        p.p1=p2.p2 AND 
        p.p2=p2.p1 AND 
        p.p1<p2.p1

小提琴演示示例

于 2013-02-23T15:26:42.830 回答
0

我认为最好的方法是使用group by. 在 SQL Server 中,这需要使用case语句:

with l as (
    select (case when p1 < p2 then p1 else p2 end) as pfirst,
           (case when p1 < p2 then p2 else p1 end) as psecond
    from likes
   )
select pfirst, psecond
from l
group by pfirst, psecond
having count(*) = 2

如果原始数据中有重复项,则having子句应为:

having count(distinct p1) = 2
于 2013-02-23T15:51:25.827 回答