当前位置: 首页 > 面试题库 >

如何基于非条件联接2个表的结果

慎峻
2023-03-14
问题内容

我有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并且仅从中获取与的任何值都不匹配TableATableA's partNumber列值的那些记录TableB's partNumber

我在下面的查询中尝试过,所有这些都给出了14条记录的相同结果,这是不正确的。

查询1:

从表B中选择b.id作为Bid,b.name作为Bname,b.partNumber作为BPart,a.id作为Aid,a.name作为Aname,a.partNumber作为APart从TableB
b左连接a.partNumber!= b上的TableA a 。零件号;

查询2:

从TableB
b中选择b.id作为Bid,b.name作为Bname,b.partNumber作为BPart,a.id作为Aid,a.name作为Aname,a.partNumber作为APart,来自TableB
b,TableA a其中a.partNumber!= b。零件号;

查询3:

选择TableB中的b.id作为Bid,b.name作为Bname,b.partNumber作为BPart,a.id作为Aid,a.name作为Aname,a.partNumber作为APart从表B中左移到TableA
a上a.partNumber不在(从TableB中选择a.id作为Aid。b在a.partNumber = b.partNumber上加入TableA
a);

有人可以帮我在这里我犯错的地方吗?什么是获得结果的正确方法

我期望输出是这样的:

+------+-------+-------+------+-------+-------+
| 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


问题答案:

您可以使用以下查询:

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以获取所有可能的组合。

演示在这里



 类似资料:
  • 创建表TableA(id int,名称varchar(20),partNumber varchar(30)); 值为: 创建表TableB(id int,名称varchar(20),零件号varchar(30)); 我尝试了以下的查询,所有的结果都是相同的14个记录,这是不正确的。 查询1: 选择b.ID作为Bid,b.Name作为Bname,b.PartNumber作为BPart,a.ID作为A

  • 问题内容: 我在使用sql时遇到问题。我想加入两个表,雇员和班主任。条件是员工具有诸如“ u0871457”之类的unid列,其中作为班主任的EmplId为“ 00871457”。 我只想将EmplId的第一个字符替换为’u’即可加入,以匹配来自unid的字符串。我怎样才能做到这一点?到目前为止,我已经尝试过了: 但这导致结果集空白。 任何帮助将不胜感激。谢谢你的时间! 问题答案: 有很多方法可以

  • 问题内容: 我需要根据其他几个表中的某些匹配值从一个表中选择结果。我有以下表格: 我需要返回每个团队的所有教练和球员的姓名。我只使用过内部联接,似乎无法在此处使用那些内部联接,所以知道如何执行此操作吗? 问题答案: 这将为您提供教练: 这将为您提供球员: 因此,非优雅,简单的答案就是将所有内容与一起扔掉。

  • 问题内容: 我想用sequelize ORM获得这样的查询: 问题是,后遗症不允许我在where子句中引用“ B”或“ C”表。以下代码 给我 这是完全不同的查询和结果 甚至不是有效的查询: 使用sequelize是否可以进行第一个查询,还是我应该坚持使用原始查询? 问题答案: 将引用联接表的列包装在

  • 问题内容: 我有第一个数据库 (dbA), 具有这样的表,名为 Username : 然后,在另一侧,我有 一个 带有这样的表的 dbB ,名为 PrivateMessage : 现在,如何组合来自2个不同数据库的这两个表,以便输出看起来像这样: 问题答案: 您可以简单地加入不同数据库的表。您需要在子句中指定数据库名称。要使其更短,请在其上添加一个, 但是有些方法却有可能-在其中没有消息。在这种情

  • 问题内容: 给定以下示例表架构 客户表 发票表 目的是选择InvoiceID值为10和20(非OR)的所有客户。因此,在此示例中,将返回带有CustID = 1和2的客户。 您将如何构造SELECT语句? 问题答案: 使用: 关键是需要计数等于子句中参数的数量。 的使用是在对帐务编号和发票编号的组合没有唯一约束的情况下- 如果没有重复的机会,则可以从查询中省略DISTINCT: