sql左联接问题未给出右表不匹配的结果

sql左联接问题未给出右表不匹配的结果,sql,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 o

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

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中的匹配项当您执行
左连接时,您将获取第一个表中的所有行,如果第一个连接条件没有匹配项,表x的结果记录将是空记录,这就是为什么要使用AND运算符“c.name is NULL”,但我认为您的查询存在一些问题。对我来说已经有一段时间了,所以我尽量不在这里出错,但是你的FROM子句中似乎没有表名,你的select不能在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]

通过一些猜测,我可以想象你想要:

SELECT DISTINCT
       t.date,
       b.amt,
       b.code,
       c.type
       FROM t
            LEFT JOIN b
                      ON b.date = t.date
                         AND b.name = t.name
            LEFT JOIN c
                      ON c.date = b.date
                         AND (c.name = b.name
                               OR c.name is null)
       WHERE t.date BETWEEN '2017-04-01'
                            AND '2018-09-30';
  • 实际上不需要来自
    t
    的子查询,可以在
    WHERE
    子句中移动对
    date
    的检查。但这并不是完全错误的。这取决于优化器如何利用它,以及什么更好
  • 虽然您的
    分组依据
    具有相同的效果,但我将其更改为一个
    独特的
    ,一眼就能看清楚
  • 我也不确定你对
    c
    的加入条件。
    • 我猜您希望
      日期
      匹配,但如果不匹配,则允许
      c.name
      为空。这意味着您必须使用括号来抵消
      高于
      的更高优先级
    • 您可能希望将连接条件中的
      b.
      s更改为
      t.
      s,如果
      t
      中的记录不存在
      b
      中的匹配记录,则还应添加
      c
      中的if记录。与现在一样,如果没有来自
      b
      的匹配记录,则不会将来自
      c
      的记录与来自
      t
      的记录合并

您的代码语法不正确。如果你解释一下你想做什么也会有帮助。您的问题建议使用两个表,但您的查询引用了两个以上的表。我在查询中有三个表。我希望表b中的amt和代码以及表c中基于日期列的类型。mysqli和sa标记在一起没有多大意义。我把它们拿走了。考虑对实际使用的DBMS进行标记。您可以从SURE语句中选择SELECT子句,它被称为嵌套SELECT语句。我的第一部分是表a和表b之间的左连接,工作正常,但表b和表c并没有给出左连接的结果,而是将其视为内部连接