如何在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