如何根据非条件连接 2 个表的结果

Posted

技术标签:

【中文标题】如何根据非条件连接 2 个表的结果【英文标题】:How to join results of 2 tables based on not condition 【发布时间】:2015-08-19 02:48:30 【问题描述】:

我有 2 个表,比如 TableATableB 定义如下:

创建表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 的记录,其中partNumber10, 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 JOINTable1 从这个查询导出的表中得到所有可能的组合。

Demo here

【讨论】:

完美,成功了。如果您不介意,请推荐一些资源(在线链接或书籍或文档),我可以在其中学习更好的 SQL。我有基本的 SQL 知识,可以写一些连接查询,但是写这种查询的时候我真的很糟糕。 @user3181365 很高兴我能提供帮助。最好的来源是!参与解决现实生活中的问题无法与任何在线资源或书籍相提并论。就 RDBMS 设计而言,this book 是真正的救星。 非常感谢您的回复,我一直在使用和研究 Oracle 数据库,那么这本书是否可以帮助我学习更好的查询,就像它所说的 SQL Server 一样? @user3181365 好吧,到目前为止,我几乎只在 SQL Server 中工作过。不幸的是,这本书是面向 SQL Server 的。 再次感谢您解决我的问题并提供建议,非常感谢:)

以上是关于如何根据非条件连接 2 个表的结果的主要内容,如果未能解决你的问题,请参考以下文章

3个表的内部连接给出重复的结果

视图中四个表的 SQL Server 条件连接

添加 2 表条件时,Oracle 左外连接停止返回结果

MySQL学习笔记连接子分页联合查询以及sql语句执行顺序总结

使用 Join 和 Union 组合来自 2 个表的结果 [关闭]

MySQL - 数据查询语言DQL数据连接语法及实例