You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQLite中实现多列匹配及跨表筛选特定行

嘿,我来帮你搞定这两个SQLite的问题,咱们一个个说清楚:

1. 如何在SQLite中执行多列匹配?

在SQLite里,多列匹配可以根据场景选择不同的实现方式,既简洁又高效:

  • 直接匹配多列相等:当需要某一行的多个列同时等于特定值时,用括号包裹列和值的写法会比多个AND更紧凑:

    -- 匹配B='b1'且C='c1'的行
    SELECT * FROM T1 WHERE (B, C) = ('b1', 'c1');
    

    这和WHERE B='b1' AND C='c1'效果完全一致,但列数多的时候可读性更强。

  • 多列批量匹配(IN子句):如果要匹配多组列值组合,多列IN的语法比一堆OR条件清爽太多:

    -- 匹配(B,C)为('b1','c1')或('b2','c2')的行
    SELECT * FROM T1 WHERE (B, C) IN (('b1','c1'), ('b2','c2'));
    
2. 筛选T1中B和C列组合在T2同一行不存在的行

针对你给出的表结构和测试数据,我们需要找出T1里那些(B,C)组合在T2中完全没有出现的行,这里有两种常用且高效的方法:

方法一:LEFT JOIN + IS NULL检查

通过LEFT JOIN关联两张表的B、C列,然后筛选出T2中没有匹配到的行(此时T2的所有列会为NULL):

SELECT T1.*
FROM T1
LEFT JOIN T2 
  ON T1.B = T2.B 
  AND T1.C = T2.C
WHERE T2.D IS NULL;

结果说明:

执行后会返回T1中的('a3', 'b3', 'c3')行——因为T2里没有B='b3'且C='c3'的记录,LEFT JOIN后T2的D列是NULL,刚好符合筛选条件。

方法二:NOT EXISTS子查询

用NOT EXISTS直接判断当前T1行的(B,C)组合是否在T2中不存在,逻辑更直观:

SELECT *
FROM T1
WHERE NOT EXISTS (
    SELECT 1  -- 这里SELECT 1仅用来判断存在性,性能拉满
    FROM T2
    WHERE T2.B = T1.B 
      AND T2.C = T1.C
);

结果说明:

子查询会逐行检查T1的(B,C)是否在T2中存在,只要不存在,NOT EXISTS就返回true,该行会被选中,最终结果和方法一完全一致。

内容的提问来源于stack exchange,提问作者Pascal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:19:43