1

この問題を解決する必要があります: 2 人の生徒 A と B が友達で、A が B を好きで、その逆ではない場合、Likes エントリを削除します。

背景として、Friend テーブルには STU1 と STU2 の 2 つの列があります。それらが友人である場合、STU1、STU2 AND STU2、STU1 を示すエントリがあります。

Likes テーブルでは、学生 A が学生 B を気に入っている場合、STU1、STU2 のエントリがありますが、学生 B が学生 A を気に入っていない場合、STU2、STU1 のエントリはありません。

だから、ここに私が試したことがあります。問題は、Likes テーブルに 2 つの行が残っていることです。これを解決する方法についてのアイデアはありますか?

delete from Likes
where exists 
    (select F.STU1, F.STU2 from Friend F
        where exists  
        (select L.STU1, L.STU2 from Likes L, Friend F where
            F.STU1 = L.STU1 and F.STU2 = L.STU2)
        )
    and not exists
        (select L.STU1, L.STU2 from Likes L, Friend F where
            F.STU1 = L.STU2 and F.STU2 = L.STU1)
4

2 に答える 2

0

フレンドテーブルには両方のペアがあるとおっしゃいました。そのため、そのペアがFriendテーブルにあるLikesテーブルからペアを削除する必要がありますが、アンチペアはLikesテーブルに存在しません。

DELETE
FROM Likes
WHERE EXISTS (SELECT 1 FROM Friend f WHERE Likes.STU1 = f.STU1 AND Likes.STU2 = f.STU2)
  AND NOT EXISTS (SELECT 1 FROM Likes ml WHERE Likes.STU1 = ml.STU2 AND Likes.STU2 = ml.STU1)
于 2013-01-30T01:50:29.613 に答える
0

編集:

with onewayfriends as (
select f.* from friend f
left outer join likes l1 on l1.stu1=f.stu1 and l1.stu2=f.stu2
left outer join likes l2 on l2.stu1=f.stu2 and l2.stu2=f.stu1
where l1.stu1 is null or l2.stu1 is null)

delete l from likes l, onewayfriends f
where l.stu1 in (f.stu1, f.stu2) and l.stu2 in (f.stu1, f.stu2)

編集 2、それは sqllite であるため、cte をネストされたクエリとして書き直し、結合を使用して削除を 'where row id in..' として書き直します。

delete from likes where rowid in (select l.rowid from
(
  select f.* from friend f
  left outer join likes l1 on l1.stu1=f.stu1 and l1.stu2=f.stu2
  left outer join likes l2 on l2.stu1=f.stu2 and l2.stu2=f.stu1
  where l1.stu1 is null or l2.stu1 is null
) f, likes l
where l.stu1 in (f.stu1, f.stu2) and l.stu2 in (f.stu1, f.stu2))

フィドル

于 2013-01-29T22:52:58.770 に答える