sql - 查找不在另一个表中的多个字段上的记录

标签 sql sqlite

假设我有两个具有以下架构的表(tb1tb2):

CREATE TABLE tb1 (
  col1 INT NOT NULL,
  col2 TEXT NOT NULL,
  col3 TEXT NOT NULL,
  col4 REAL
);


如何找到tb1tb2col1列中col2中不存在的col3记录?

我研究了thisthisthis,但到目前为止,它们都只在一个列上找到记录。我还在这些链接中使用了代码/逻辑,但最终返回了错误的结果,但性能却非常差(tb1上有45K条记录,tb2上有170万条记录)。我正在尝试在SQLite上实现这一点。

如果您想看,这是我的示例代码(使用带w的左连接,其中null为空),但不要依赖它:

SELECT *
FROM tb1
LEFT JOIN tb2
ON
tb1.col1 = tb2.col1 AND
tb1.col2 = tb2.col2 AND
tb1.col3 = tb2.col3
WHERE
tb2.col1 IS NULL AND
tb2.col2 IS NULL AND
tb2.col3 IS NULL

最佳答案

尝试使用NOT EXISTS,当然,性能可能取决于现有索引...

SELECT *
FROM tb1
WHERE NOT EXISTS
 ( 
   SELECT *
   FROM tb2
   WHERE
      tb1.col1 = tb2.col1 AND
      tb1.col2 = tb2.col2 AND
      tb1.col3 = tb2.col3
 ) 

关于sql - 查找不在另一个表中的多个字段上的记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30296988/

相关文章:

php - 如何对表示具有多个答案的民意调查的两个表使用一个查询?

mysql - 在 A 行上左连接多个 B 行时如何对 A 行列求和

sql - Spring Data JPA - 查询日期减去 2 天不起作用

sqlite - sqlite在Cygwin中不读取.sqliterc

sql - 搜索子级满足谓词的父级记录

mysql - SQL:删除除每个用户的最后 X 条消息之外的旧消息

sql - 如何使用 SQL 更新将列表或映射值放入嵌入映射中?

java - 将外键插入表中

c++ - 指针改变地址

sqlite - 在 Valentina Studio 中创建表错误