sql - 从没有主键的表中删除行,SQL

标签 sql sqlite

我正在尝试从 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/

相关文章:

SQL Server - 使用 group by 聚合比没有聚合更快

c# - 转换参数C#/SQL Server失败

sql - 如何向用户授予执行 pgcrypto 摘要功能

java - 从 SQLite 获取数据到新类

android - 如何在sqlite3中获取带有查询数据的列名?

sql - 在SQLite中,如何使用另一个表中的列值将新列插入s表中?

python - 将具有一些公共(public)字段的多个表组合成一个表

sql - 更新表中的第 n 条记录 - sql server

unit-testing - 使用 PDO Sqlite 内存数据库进行 PHPUnit 测试

python - 如何修复 'django.db.utils.OperationalError: near "无“: syntax error' db. sqlite3?