【问题标题】:SQL Left join with no id not returning [closed]没有ID的SQL左连接不返回[关闭]
【发布时间】:2013-09-13 15:33:30
【问题描述】:

我觉得我在这里遗漏了一些简单的东西......

表 A(名称、值)

ABC  123
DEF  456
XYZ  789
NON  111

表 B(名称 1、名称 2、颜色)

ABC  NULL  Red
NULL DEF   Blue

SQL 查询

select * 
from TableA A
left join TableB B on A.name = B.name1 or A.name = B.name2

这样做只会返回

A.name、a.value、b.color

ABC 123 Red
DEF 456 Blue

我需要它返回

A.name、a.value、b.color

ABC 123 Red
DEF 456 Blue
XYZ 789 NULL
NON 111 NULL

不包括左表中的行。

【问题讨论】:

  • 您的查询看起来与您想要的输出正确。
  • 您的代码看起来是正确的。我会检查您是否确实在使用此代码,并且没有交换表(从 B 连接到 A),并且您正在执行 LEFT JOIN
  • 检查了您的查询。它在 Mysql 上正常工作
  • 这里是 SQL Fiddle,表明上述方法在 SQL Server (sqlfiddle.com/#!3/48d02/1) 中有效。
  • 用 SQL 检查。工作得很好。

标签: sql sql-server tsql left-join


【解决方案1】:

您对第一个答案的评论说“我有一些其他表正在加入,这只是一个简化的示例”。我猜:

1) 这些表之一在您的查询中连接到 TableB

2) 这个附加表在 WHERE 子句中被引用

3) 相关联接不是 LEFT JOIN,和/或 WHERE 子句未计入 NULL

这些东西会结合起来否定你的 LEFT JOIN 的效果,比如下面的例子:

select * 
from TableA A
left join TableB B on A.name = B.name1 or A.name = B.name2
left join TABLEC C ON b.Field1 = C.Field1
WHERE C.MyField = 'avalue'

【讨论】:

  • 我正在加入更多表,但我只在加入此表时看到问题,我知道如果不查看实际查询和数据就很难诊断它。当我注释掉这个连接时,我得到了我预期和验证的行数(96),当我做这个左连接时,我得到 47。它不包括左表中与右表不匹配的任何行。
【解决方案2】:

假设您需要将表 A 中的所有条目与表 B 中的匹配条目连接起来,您需要这样的查询 -

SELECT 
     A.Name, 
     A.Value, 
     B.Color 
 FROM 
     TableA A 
     LEFT OUTER JOIN TableB B 
         ON (A.Name B.Name1 OR A.Name = B.Name2)

【讨论】:

  • 打败我。这是 OP 的一些信息 - difference between inner and outer join
  • 那么这个和OP的样本有什么区别呢?括号?请注意,LEFT JOINLEFT OUTER JOIN相同 - OUTER 关键字完全是可选的。
  • 我认为左外连接和左连接也一样
  • @Miguel-F 我了解连接应该如何工作,我只是不明白为什么这个左连接不能正常工作,但感谢链接。
【解决方案3】:

如果执行以下查询

select A.name, a.num, b.color 
from TableA A
left join TableB B on A.name = B.name1 or A.name = B.name2

它会得到结果

ABC 123 Red
DEF 456 Blue
XYZ 789 NULL
NON 111 NULL

【讨论】:

    猜你喜欢
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    相关资源
    最近更新 更多