Teradata SQL查询问题

时间:2018-10-09 11:21:35

标签: sql teradata

我在使用以下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”,则该查询有用

怎么可能?

2 个答案:

答案 0 :(得分:0)

如果子查询中的任何值为NOT IN,则

NULL返回无行

因此,我强烈建议您始终使用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

答案 1 :(得分:0)

将NOT IN重写为联接(请查看说明)。使用Null -values连接是“未定义”,意思是:“不好玩”。 尝试在内部SQL中添加“ WHERE ACC_NO IS NOT NULL”。