首页 > 解决方案 > sql左连接问题没有给出右表不匹配的结果

问题描述

我想要左表中的所有记录和右表中的匹配记录,但下面的查询没有给出正确的结果:

select a.date,b.amt,b.code,c.type
from (select date from t where date is between '2017-04-01' and '2018-09-30')a
    on a.date = b.date and a.name = b.name left join
    c on c.date = b.date and c.name = b.name or c.name is null
group by a.date,b.amt,b.code,c.type

我看不到表 b 中所有代码的值。它只返回表 c 中的匹配项

标签: sql

解决方案


当您执行 aLEFT JOIN时,您将从第一个表中获取所有行,如果第一个连接条件没有匹配项,则表 x 的结果记录将是 NULL 记录,这就是您使用 AND 运算符 'c 的原因.name IS NULL' 但我认为您的查询存在一些问题。对我来说已经有一段时间了,所以我尽量不在这里出错,但是您的 FROM 子句中似乎没有表名,并且您的选择不能在 from 子句中(我不认为) ...也许我错了,但我必须清理声明以了解您做得更好...所以请澄清一下,我可以改进我的答案。

SELECT 
   [a].[date] AS 'Date'
  ,[b].[amt]  AS 'Amount'
  ,[b].[code] AS 'Code'
  ,[c].[type] AS 'Type'

FROM [table].[name] (NOLOCK)
  LEFT JOIN [table].[name] (NOLOCK) date ON [c].[date] = [b].[date]
  LEFT JOIN [table].[name] (NOLOCK) name ON [c].[name] = [b].[name]

WHERE (SELECT date 
       FROM [t]
       WHERE DATEADD (hh,-6, DATEADD (ss,[table].[name],'1970')) BETWEEN '2017-04-01' AND '2018-09-30')
   AND [a].[date] = [b].[date] //Not sure if this is what you meant
   AND [a].[name] = [b].[name]
   AND [c].[name] IS NULL

GROUP BY [a].[date],[b].[amt],[b].[code],[c].[type]

推荐阅读