我有两张桌子,比如TableA
& TableB
定义如下:
create table TableA(id int,name varchar(20),partNumber varchar(30));
值为:
insert into TableA values(1,'a1','10');
insert into TableA values(2,'a2','20');
insert into TableA values(3,'a3','30');
insert into TableA values(4,'a4','40');
create table TableB(id int,name varchar(20),partNumber VARCHAR(30));
insert into TableB values(5,'b1','10');
insert into TableB values(6,'b2','20');
insert into TableB values(7,'b3','60');
insert into TableB values(8,'b4','70');
现在,在结果中,我想要加入这两个表并获取TableB
中的所有记录,并且仅获取TableA
中TableA's partNumber
列值与任何值不匹配的记录价值TableB's partNumber
。
我已尝试过以下查询,并且所有这些查询都给出了14条不正确的记录。
查询1:
选择b.id作为Bid,b.name作为Bname,b.partNumber作为BPart,a.id as Aid,a.name为Aname,a.partNumber为APart,来自TableB b左连接 表a a on apartNumber!= b.partNumber;
查询2:
选择b.id作为Bid,b.name作为Bname,b.partNumber作为BPart,a.id as Aid,a.name为Aname,a.partNumber为APart,来自TableB b,TableA a 其中a.partNumber!= b.partNumber;
查询3:
选择b.id作为Bid,b.name作为Bname,b.partNumber作为BPart,a.id as Aid,a.name为Aname,a.partNumber为APart,来自TableB b左连接 表a a在a.partNumber上没有(选择a.id作为来自TableB b Aid的Aid) 表a a on a.partNumber = b.partNumber);
有人可以帮助我在这里犯错吗?获得结果的正确方法是什么。
我期待输出如下:
+------+-------+-------+------+-------+-------+
| Bid | Bname | BPart | Aid | Aname | APart |
+------+-------+-------+------+-------+-------+
| 5 | b1 | 10 | 3 | a3 | 30 |
| 5 | b1 | 10 | 4 | a4 | 40 |
| 6 | b2 | 20 | 3 | a3 | 30 |
| 6 | b2 | 20 | 4 | a4 | 40 |
| 7 | b3 | 60 | 3 | a3 | 30 |
| 7 | b3 | 60 | 4 | a4 | 40 |
| 8 | b4 | 70 | 3 | a3 | 30 |
| 8 | b4 | 70 | 4 | a4 | 40 |
+------+-------+-------+------+-------+-------+
所以我的意思是在结果中我不希望TableA
的记录partNumber
是10, 20
,因为TableB's partNumber
中存在值。< / p>
答案 0 :(得分:4)
您可以使用以下查询:
SELECT id, name, partNumber, Aid, Aname, Apart
FROM TableB AS t
CROSS JOIN (SELECT id AS Aid, name AS Aname, partNumber AS Apart
FROM TableA AS a
WHERE NOT EXISTS (SELECT 1
FROM TableB AS b
WHERE b.partNumber = a.partNumber)) AS c
ORDER BY id
我们的想法是使用TableA
子句从NOT EXISTS
中选择所有必需的记录。然后使用CROSS JOIN
Table1
此查询中的派生表获取所有可能的组合。