如何根据非条件连接 2 个表的结果
Posted
技术标签:
【中文标题】如何根据非条件连接 2 个表的结果【英文标题】:How to join results of 2 tables based on not condition 【发布时间】:2015-08-19 02:48:30 【问题描述】:我有 2 个表,比如 TableA
和 TableB
定义如下:
创建表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');
创建表 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 作为 Aid, a.name as Aname, a.partNumber as APart from TableB b left join 表A a.partNumber!=b.partNumber;
查询 2:
选择 b.id 作为 Bid,b.name 作为 Bname,b.partNumber 作为 BPart,a.id 作为 Aid, a.name as Aname, a.partNumber as APart from TableB b , TableA a 其中 a.partNumber!=b.partNumber;
查询 3:
选择 b.id 作为 Bid,b.name 作为 Bname,b.partNumber 作为 BPart,a.id 作为 Aid, a.name as Aname, a.partNumber as APart from TableB b left join TableA a on a.partNumber not in (select a.id as Aid from TableB b join 表A 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
中。
【问题讨论】:
【参考方案1】:您可以使用以下查询:
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
这个想法是使用NOT EXISTS
子句从TableA
中选择所有需要的记录。然后将CROSS JOIN
与Table1
从这个查询导出的表中得到所有可能的组合。
Demo here
【讨论】:
完美,成功了。如果您不介意,请推荐一些资源(在线链接或书籍或文档),我可以在其中学习更好的 SQL。我有基本的 SQL 知识,可以写一些连接查询,但是写这种查询的时候我真的很糟糕。 @user3181365 很高兴我能提供帮助。最好的来源是!参与解决现实生活中的问题无法与任何在线资源或书籍相提并论。就 RDBMS 设计而言,this book 是真正的救星。 非常感谢您的回复,我一直在使用和研究 Oracle 数据库,那么这本书是否可以帮助我学习更好的查询,就像它所说的 SQL Server 一样? @user3181365 好吧,到目前为止,我几乎只在 SQL Server 中工作过。不幸的是,这本书是面向 SQL Server 的。 再次感谢您解决我的问题并提供建议,非常感谢:)以上是关于如何根据非条件连接 2 个表的结果的主要内容,如果未能解决你的问题,请参考以下文章
MySQL学习笔记连接子分页联合查询以及sql语句执行顺序总结