【问题标题】:LEFT JOIN ON NULL Key Values Combined with GROUP BYLEFT JOIN ON NULL 键值结合 GROUP BY
【发布时间】:2022-01-08 08:46:58
【问题描述】:

我正在使用 Teradata SQL,我编写了以下查询(注意 LEFT JOIN)

SELECT
    key1,
    secondvalue,
    count(DISTINCT firstvalue)
FROM
(
    SELECT
        t1.val AS firstvalue,
        t1.key1,
        t2.val AS secondvalue
        
    FROM table1 t1
    LEFT JOIN table2 t2 ON t1.key1 = t1.key1 AND t1.key2 = t2.key2 AND t1.key3 = t2.key3
) AS Testcase
GROUP BY 1, 2

t1.key2 和 t1.key3(左侧表)的某些条目为 NULL。在这种情况下,行没有显示在结果中,为什么?是 Teradata 特有的吗,我希望 LEFT JOIN 显示具有 NULL 值的行。

例如,如果我选择将 LEFT JOIN 语句减少为

SELECT
    key1,
    secondvalue,
    count(DISTINCT firstvalue)
FROM
(
    SELECT
        t1.val AS firstvalue,
        t1.key1,
        t2.val AS secondvalue
        
    FROM table1 t1
    LEFT JOIN table2 t2 ON t1.key1 = t1.key1
) AS Testcase
GROUP BY 1, 2

key1 出现了更多不同的值,这不应该是这样,对吧?我希望看到 key1 的所有不同值,即使 key2 和 key3 为 NULL。如果没有,我想从第二个表中查看具体值。

我真的不想先将 NULL 值映射到另一个值。

【问题讨论】:

  • 您是否知道您的连接谓词具有始终为真的条件? t1.key1 = t1.key1 t1.key1 将始终匹配 t1.key1。我想你的意思是t2.key1 = t1.key1
  • Testcase 中的第 1 列和第 2 列是什么?您认为它们指的是哪个表的哪些列?您引用权威文档“不应该如此”的理由是什么? (我们可以预期您的期望是错误的,而不是 DBMS。此外,如果您不说出期望是什么,我们如何解决您的期望?“为什么”的答案是,因为这就是语言的定义方式;不要问另一个演示文稿。)minimal reproducible example PS LEFT JOIN 返回 INNER JOIN 行 UNION ALL 由 NULL 扩展的不匹配的左表行。作为 OUTER JOIN 的一部分,始终知道您想要什么 INNER JOIN。
  • @philipxy 感谢您的有用评论 :)!

标签: sql join group-by teradata


【解决方案1】:

t1.key2 和 t1.key3(左侧表)的某些条目为 NULL。在这种情况下,行没有显示在结果中,为什么?

可能是因为group bydistinct 会将所有空值组合在一起。的确,在 SQL 中,null 不一定等于 null,但我相信从不同的角度和分组的角度来看,nulls 被认为是相同的。

我希望 LEFT JOIN 显示具有 NULL 值的行。

我从未尝试过左侧为 null 的左外连接。我不能说连接是否会为这样的行发出结果,但我可以告诉你它不会匹配等连接,因为null 不等于null。您在寻找完整的外部联接吗?

LEFT JOIN table2 t2 ON t1.key1 = t1.key1

该谓词将匹配t1.key1 is not null 所在的每一行,这几乎是笛卡尔积。这就是为什么你的计数要大得多。

我想你想要

LEFT JOIN table2 t2 ON t1.key1 = t2.key1

我想查看 key1 的所有不同值,即使 key2 和 key3 为 NULL

总的来说,我认为你想要的是

LEFT JOIN table2 t2 ON t1.key1 = t2.key1 AND coalesce(t1.key2, -1) = coalesce(t2.key2, -1) AND coalesce(t1.key3, -1) = coalesce(t2.key3, -1)

您希望 coalesce 的第二个参数是 key2key3 的任何类型的语法有效值,但在您使用它时是无效的值(否则,我们会加入一侧有-1,另一侧有null

【讨论】:

  • 建议(在 Teradata 中)使用 ...AND (t1.key2 = t2.key2 OR t1.key2 IS NULL AND t2.key2 IS NULL) AND... 而不是 COALESCE。无需为 coalesce 找到一个未使用的值,并且可能会更高效。
  • mh,奇怪的是你的推荐(coalesce)和@dnoeth 不起作用。它们缺少 3 个主键 (key1) 值。我不明白。明天我必须进一步研究这种情况。
  • 在仔细重新分析数据后,我得出结论,您的解决方案符合我的需求。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 2021-01-30
  • 2020-05-17
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2020-11-12
相关资源
最近更新 更多