【发布时间】:2019-02-16 07:13:35
【问题描述】:
我正在将此查询从 Netezza 转换为与我的 RedShift dw 一起运行。我不断收到此错误。
亚马逊无效操作:尚不支持此类IN/NOT IN查询;
我尝试使用“EXISTS/NOT EXISTS”条件转换它,但仍然没有成功。有人可以提供他/她的意见,我应该如何转换 IN,而不是部分?
CREATE TEMP TABLE TMP_EMPLY_BRND AS
(
Select EMPLY_SRRGT_ID,
EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_STRT_DT_KEY,
EMPLY_PRMRY_PRDCT_DPRTMNT_GRP_SRRGT_ID,
From
((
(SELECT E.EMPLY_SRRGT_ID,
E.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_STRT_DT_KEY,
FROM INS_EDW_CP.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT E
where (((E.EMPLY_SRRGT_ID, E.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_STRT_DT_KEY, E.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_END_DT_KEY )=ANY
(SELECT distinct A.EMPLY_SRRGT_ID , A.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_STRT_DT_KEY, A.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_END_DT_KEY
FROM INS_EDW_CP.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT A
WHERE (A.EMPLY_PRMRY_BRND_SRRGT_ID > 0 )
GROUP BY A.EMPLY_SRRGT_ID , A.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_STRT_DT_KEY, A.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_END_DT_KEY
HAVING ((COUNT(DISTINCT A.EMPLY_PRMRY_PRDCT_DPRTMNT_GRP_SRRGT_ID) > 1)
AND (COUNT(DISTINCT A.EMPLY_PRMRY_BRND_SRRGT_ID) = 1))))
or ((E.EMPLY_MRCHNDS_GRP_NBR , E.EMPLY_PRMRY_BRND_SRRGT_ID) in (select 947,-1)
or (E.EMPLY_MRCHNDS_GRP_NBR , E.EMPLY_PRMRY_BRND_SRRGT_ID) in (select 952,-1) ))
Group BY
E.EMPLY_SRRGT_ID,
UNION
SELECT E.EMPLY_SRRGT_ID,
E.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_STRT_DT_KEY,
FROM INS_EDW_CP.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT E
where (
((E.EMPLY_SRRGT_ID, E.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_STRT_DT_KEY, E.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_END_DT_KEY )<>ALL
(SELECT distinct A.EMPLY_SRRGT_ID , A.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_STRT_DT_KEY, A.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_END_DT_KEY
FROM INS_EDW_CP.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT A
WHERE (A.EMPLY_PRMRY_BRND_SRRGT_ID > 0 )
GROUP BY A.EMPLY_SRRGT_ID , A.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_STRT_DT_KEY, A.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_END_DT_KEY
HAVING ((COUNT(DISTINCT A.EMPLY_PRMRY_PRDCT_DPRTMNT_GRP_SRRGT_ID) > 1)
AND (COUNT(DISTINCT A.EMPLY_PRMRY_BRND_SRRGT_ID) = 1)))
)
and ((E.EMPLY_MRCHNDS_GRP_NBR,E.EMPLY_PRMRY_BRND_SRRGT_ID) not in (select 947,-1)
and (E.EMPLY_MRCHNDS_GRP_NBR,E.EMPLY_PRMRY_BRND_SRRGT_ID) not in (select 952,-1)))
) X
JOIN INS_EDW_CP.DT D1
ON D1.DT_KEY between X.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT_EFF_STRT_DT_KEY and X.EFF_END_DT_KEY
JOIN INS_EDW_CP.DT_CLNDR_TYPE D2
on ((D1.DT_KEY = D2.DT_KEY) AND (D2.CLNDR_TYPE = 1)))
);
【问题讨论】:
-
我认为您需要将
ANY和ALL子句转换为 ANSI SQL 连接(可能是左外连接)。在不了解域的情况下,我无法轻松地为您转换 SQL。尾随逗号还有许多语法问题。 -
嗨,乔,感谢您的回复。我发现了问题。问题出在 ANY 运算符上。如果我用一个键即 E.EMPLY_SRRGT_ID 应用它,那么它工作正常。但是由于比较是用三个键进行的,所以它会给出错误,因为 INS_EDW_CP.EMPLY_PRMRY_BRND_PRDCT_DPRTMNT 表是空的,并且嵌套查询也会给出空结果。那么我应该如何处理这些 EMPTY 的东西呢?
-
问题在于 HAVING ((COUNT(DISTINCT A.EMPLY_PRMRY_PRDCT_DPRTMNT_GRP_SRRGT_ID) > 1) AND (COUNT(DISTINCT A.EMPLY_PRMRY_BRND_SRRGT_ID) = 1)) 部分,我不知道发生了什么。当我将其注释掉时,它可以正常工作,否则会给出错误“尚不支持此类 IN/NOT IN 查询;”
标签: amazon-redshift exists notin