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

时间:2018-04-20 07:23:02

标签: sqlite

鉴于两个表T1T2具有重叠的列定义(BC),如何选择T1中{{1}的行在B中找不到C(在同一行? T1 without T2 这是设置:

T2

通过以下查询,我可以选择正确的行。但是,这仅限于列create table T1('A' TEXT, 'B' TEXT, 'C' TEXT); insert into T1 values ('a1', 'b1', 'c1'), ('a2', 'b2', 'c2'), ('a3', 'b3', 'c3'); create table T2('B' TEXT, 'C' TEXT, 'D' TEXT); insert into T2 values ('b1', 'c1', 'd1'), ('b2', 'c2', 'd2'), ('b4', 'c4', 'd4'); B,因此缺少C

A

我想做的是:

select B, C from T1
intersect
select * from (select B, C from T1
               except
               select B, C from T2);
-- this yields:
-- b3|c3

(请注意第一个select * from T1 intersect select * from (select B, C from T1 except select B, C from T2); -- this yields: -- Error: SELECTs to the left and right of INTERSECT do not have the same number of result columns 语句中的*。)我似乎无法掌握使用子查询选择行并返回完整行的概念。

如何更改查询以使结果为select

顺便说一下,这是一个真实的例子,我从文件系统的恢复中转储文件名,我想知道恢复中缺少哪些文件。

1 个答案:

答案 0 :(得分:1)

也许不是最好/最优雅的解决方案,但以下似乎有效: -

SELECT A, X1B AS B, X1C AS C FROM
    (select X1.B AS X1B, X1.C AS X1C from T1 AS X1
       except
       select T2.B, T2.C from T2) 
JOIN T1 ON B = X1B AND C = X1C

或: -

SELECT A, B, C FROM
    (select X1.B AS X1B, X1.C AS X1C from T1 AS X1
        except
        select T2.B, T2.C from T2) 
JOIN T1 ON B = X1B AND C = X1C

导致: -

enter image description here