我正在尝试从 SQL 表中删除几行。问题是我不知道如何使用子查询的结果从该表中删除,因为该表中没有主键。表的结构如下:
friend (ID1,ID2)
ID1
的学生是 ID2
的学生的 friend 。友谊是相互的,所以如果 (123, 456)
在 Friend 表中,那么 (456, 123)
也是。
Likes ( ID1, ID2 )
ID1
的学生喜欢ID2
的学生。喜欢某人不一定是相互的,因此如果 (123, 456)
在 Likes 表中,则不能保证 (456, 123)
也存在。
(No primary key)
我要解决的情况是:
“如果两个学生 A 和 B 是 friend ,并且 A 喜欢 B 但不喜欢 B,则删除 Likes 元组。”
提前致谢。
最佳答案
要解决您的问题,请使用以下 sql 查询
delete from friend where (ID1,ID2) not in
(Select f1.ID1,f1.ID2 from friend f1, friend f2 where f1.ID1 = f2.ID2 && f1.ID2 = f2.ID1)
如果您的数据库不支持“in”子句中的多列,则使用以下查询
delete from friend where concat(ID1,':',ID2) not in
(Select concat(f1.ID1,':',f1.ID2) from friend f1, friend f2
where f1.ID1 = f2.ID2 && f1.ID2 = f2.ID1)
我们可以将 ID1 和 ID2 的组合视为复合主键吗?
最好始终在每个表中使用主键。 请在您的表中添加一个带有整数自动递增字段的主键,这将很容易地解决您的问题
关于sql - 从没有主键的表中删除行,SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18392793/