【问题标题】:does Left Join in SQL not shows matching value in second table? [duplicate]SQL 中的左连接不显示第二个表中的匹配值吗? [复制]
【发布时间】:2021-03-05 21:55:59
【问题描述】:

我看到下面的问题,我认为这是错误的,但正确的答案是正确的。

表 CUSTOMER 和 AGENT 的左外连接,具有 客户列在首位,代理列在首位 SQL 命令中的第二个,产生 CUSTOMER 表,包括那些没有 AGENT 表中的匹配值。

根据上面的问题,应该在下面选择:

select C.*, A.*
from Customer C
left join Agent A on A.CID = C.CID

所以上述语句的结果是客户表中的所有行+客户和代理表中的匹配值。 (我的教授说真/假问题是正确的,但似乎是错误的)。

【问题讨论】:

  • 是的,有一个警告:如果Customer 中的一行在Agent 中有多个匹配项,那么来自Customer 的行将在结果集中出现多次,每个匹配行一个.
  • MySQL 或 (MS)sql-server?
  • @MajidRezaie 我认为这是真的,因为来自 Customer 的所有行都会显示出来。不过,其中一些会出现多次。
  • 对或错,我发现它作为一种考虑连接有点受限的方式很有用。
  • What is the difference between “INNER JOIN” and “OUTER JOIN”? PS 遵循出版的教科书,而不是随机的网页。所以关于定义的关系数据库答案也大多是无用的。请注意,该链接中指向我的答案的所有其他答案都不能准确解释外连接返回的内容,除了另一个之外,所有其他答案都不清楚且没有帮助。就像你的报价一样。接受的答案非常糟糕。在那里阅读我所有的 cmets。

标签: sql join left-join


【解决方案1】:

如果你尝试一下,你会很容易看到引用的陈述是真的。当代理表中不存在匹配行时,仍会显示客户行,例如下面是客户 2。

declare @Customer table (id int, [Name] varchar(32));
declare @Agent table (id int, CustomerId int, [Name] varchar(32));

insert into @Customer (id, [Name])
values
(1, 'Test Customer 1'),
(2, 'Test Customer 2');

insert into @Agent (id, CustomerId, [Name])
values
(1, 1, 'Test Agent 1');

select C.id [Customer id], C.[Name] [Customer Name], A.id [Agent id], A.CustomerId [Agent Customer id], A.[Name] [Agent Name]
from @Customer C
left join @Agent A on A.CustomerId = C.id;

结果

Customer id Customer Name Agent id Agent Customer id Agent Name
1 Test Customer 1 1 1 Test Agent 1
2 Test Customer 2 NULL NULL NULL

正如 The Impaler 指出的那样,如果每个客户存在多个代理,您可以获得重复的客户行,例如如果您将以下 SQL 附加到我们已有的 SQL 中:

insert into @Agent (id, CustomerId, [Name])
values
(2, 1, 'Test Agent 2');

你得到

Customer id Customer Name Agent id Agent Customer id Agent Name
1 Test Customer 1 1 1 Test Agent 1
1 Test Customer 1 2 1 Test Agent 2
2 Test Customer 2 NULL NULL NULL

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-19
    相关资源
    最近更新 更多