鉴于两个表T1
和T2
具有重叠的列定义(B
和C
),如何选择T1
中{{1}的行在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
?
顺便说一下,这是一个真实的例子,我从文件系统的恢复中转储文件名,我想知道恢复中缺少哪些文件。
答案 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
导致: -