【问题标题】:Left Outer Join of Same Table (self-join; not first table) Not Returning Null Values同一张表的左外连接(自连接;不是第一个表)不返回空值
【发布时间】:2018-06-26 21:07:09
【问题描述】:

我在一个表(不是第一个表)上的 LEFT OUTER JOIN 子句本身(也是自连接)没有返回空值,这会扭曲我的 SELECT 语句。查询写入(表名无关紧要):

Select
SUM(CASE WHEN table2.date =‘day’ and table4.columnX =‘5’ then table3.value1 END),
SUM(CASE WHEN table2.date=’day’ and table4.columnX IS NULL then table3.value2 END)
FROM table1
INNER JOIN table2 on ...
INNER JOIN table3 on ...
LEFT OUTER JOIN table4 on table4.columnX=’5’

其中第一个 SUM(CASE WHEN) 语句使用 table4.columnX 中的一个值 - 当它等于 '5' 时 - 第二个 SUM(CASE WHEN) 语句使用所有其他值 - 只要它不等于到“5”。

就目前而言,查询仅返回 table4.columnX='5' 的结果,而不是 table4.columnX 等于其他所有内容的结果。因此,LEFT OUTER JOIN 似乎没有返回 table4.columnX'5' 的所有空值。我认为这可能是因为连接写错了。请注意,table4 中没有可以连接到其他表中的字段的字段,因此它必须是某种自连接(我相信)。非常感谢您的帮助 - 谢谢!

【问题讨论】:

  • 您对 table4 的左连接不是自连接也不是正确连接
  • 这不是自联接。自联接是指表对自身使用联接。我不知道 Teradata,但在 T-SQL 中你会想要一个交叉连接,这听起来像。
  • table2.date = 'day' 时,您似乎总是在table4 中有匹配项。

标签: sql teradata


【解决方案1】:

LEFT OUTER JOIN 将做的是从“左表”中获取所有行,并有条件地连接“右表”中的行。如果对于“左表”中的特定行,“右表”中没有匹配的行,则连接行的“右数据值”将为 NULL。

不过,您的连接条件很奇怪,因为它没有引用另一个表。如果这确实是您想要的,那么您应该将其更改为 CROSS JOIN:

旧:LEFT OUTER JOIN table4 on table4.columnX=’5’
新:CROSS JOIN table4 on table4.columnX=’5’

这会将table4 中的所有行(其中columnX = 5)连接到上述查询中的每一行。不确定这是否是您要寻找的...

【讨论】:

    猜你喜欢
    • 2011-07-22
    • 2012-02-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2018-03-05
    • 1970-01-01
    • 2011-12-21
    • 2015-01-19
    相关资源
    最近更新 更多