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

如何在SQLite中执行多列匹配?,sqlite,Sqlite,给定两个列定义重叠的表T1和T2(B和C),如何选择T1中的行,其中B和C在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 i

给定两个列定义重叠的表
T1
T2
B
C
),如何选择
T1
中的行,其中
B
C
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
语句中的
*
)我似乎无法理解使用子查询选择行并返回整行的概念

如何更改查询以使结果为
a3 | b3 | c3


顺便说一句,这是一个真实的例子,其中我有一个文件系统恢复时的文件名转储,我想知道恢复过程中丢失了哪些文件。

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

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*from T1,select T1除外。*from T1 join T2 on T1.B=T2.B和T1.C=T2.C;
。我发现您示例中的列重命名有点混乱,所以我尝试回避这个问题。从我的角度来看,修改后的查询更容易理解。但这可能是我缺乏经验的原因使用SQL进行编辑。@MikeT谢谢你的提示!@Pascal不,你的更好,它不那么复杂。
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