[Amazon](500310) 无效操作:尚不支持此类IN/NOT IN查询;

Posted

技术标签:

【中文标题】[Amazon](500310) 无效操作:尚不支持此类IN/NOT IN查询;【英文标题】:[Amazon](500310) Invalid operation: This type of IN/NOT IN query is not supported yet; 【发布时间】: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)))
);

【问题讨论】:

我认为您需要将 ANYALL 子句转换为 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 查询;” 【参考方案1】:

where子句中有常量值,不需要exists子句。

你可以试试下面 -

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  ( 947,-1)
                   or  (E.EMPLY_MRCHNDS_GRP_NBR , E.EMPLY_PRMRY_BRND_SRRGT_ID) in  ( 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  ( 947,-1)
                   and (E.EMPLY_MRCHNDS_GRP_NBR,E.EMPLY_PRMRY_BRND_SRRGT_ID) not in  ( 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)))
);

【讨论】:

感谢您的回复。我试过了,但是得到“[Amazon](500310) Invalid operation: arguments of row IN must all be row expressions;” 任何人请回复。

以上是关于[Amazon](500310) 无效操作:尚不支持此类IN/NOT IN查询;的主要内容,如果未能解决你的问题,请参考以下文章

AMAZON 500310:无效操作:“Drop”处或附近的语法错误

[Amazon](500310) 无效操作:尚不支持此类IN/NOT IN查询;

Redshift 存储过程 - [Amazon](500310) 无效操作:“$1”处或附近的语法错误;

SQL 错误 [500310] [42703]: [Amazon](500310) 无效操作:events_20180626_temp 中不存在列“engagement_time_msec”;

如何通过手动查询重现:[Amazon](500310) 无效操作:找不到从“未知”到整数的转换函数;

更新声明:[Amazon](500310) 无效操作:目标表必须是等值连接谓词的一部分;