【发布时间】: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.key1t1.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