【问题标题】:Issue with Teradata SQL queryTeradata SQL 查询问题
【发布时间】:2018-10-09 22:19:22
【问题描述】:

我在使用以下 SQL 查询时遇到了一些问题

SELECT DISTINCT A.ACC_NO
FROM FIRST_TABLE A
WHERE A.ACC_NO = 1
AND A.ACC_NO NOT IN 
(
    SELECT DISTINCT ACC_NO
    FROM SECOND_TABLE B                            
    LEFT JOIN THIRD_TABLE C
    ON B.FIELD_NAME = C.FIELD_NAME
)
ORDER BY A.ACC_NO

以下查询不返回任何内容,即使我知道内部选择不包含 ACC_NO 为 1 的条目。如果我运行以下命令:

SELECT DISTINCT ACC_NO
FROM SECOND_TABLE B                            
LEFT JOIN THIRD_TABLE C
ON B.FIELD_NAME = C.FIELD_NAME
WHERE ACC_NO = 1

它不返回任何东西。

但是,如果我在(第一个查询的)内部选择中包含“WHERE ACC_NO 1”,则查询确实有效。

这怎么可能?

【问题讨论】:

    标签: sql teradata


    【解决方案1】:
    如果子查询中的 any 值为NULL,

    NOT IN 返回无行。

    因此,我强烈建议您始终使用NOT EXISTS 而不是NOT IN。所以:

    SELECT DISTINCT A.ACC_NO
    FROM FIRST_TABLE A
    WHERE A.ACC_NO = 1 AND
          NOT EXISTS (SELECT 1
                      FROM SECOND_TABLE B LEFT JOIN                           
                           THIRD_TABLE C
                           ON B.FIELD_NAME = C.FIELD_NAME
                      WHERE ?.ACC_NO = A.ACC_NO
                     );
    

    ?.ACC_NO 是因为我不知道哪个表有ACC_NO,虽然我可以推测它是B。

    【讨论】:

    • 当我尝试添加“不存在”时出现错误。它在 Teradata SQL 中不起作用吗?
    • @klippy 。 . . NOT EXISTS 绝对适用于 Teradata。答案有错别字。
    • 我已经复制并粘贴了您的确切代码,但它仍然显示为错误。难道我的 teradata 版本不支持吗?
    • @klippy 。 . .您需要将? 替换为该列来自的表的别名。
    • “A.ACC_NO AND NOT EXISTS”部分似乎是问题所在。如果我删除“A.ACC_NO AND”,它就会运行。它没有给我正确的答案,但没有错误
    【解决方案2】:

    NOT IN 被重写为连接(查看解释)。加入 Null -values 是“未定义”,意思是:“没有乐趣”。 尝试将“WHERE ACC_NO IS NOT NULL”添加到内部 SQL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-02
      • 2020-10-23
      • 2012-12-25
      • 2017-04-21
      • 2010-12-20
      相关资源
      最近更新 更多