Postgresql 在WHERE NOT in-like子句中使用数组变量

Postgresql 在WHERE NOT in-like子句中使用数组变量,postgresql,Postgresql,我已将数组变量声明为 select array(select "account_id" from [some where clause]) as negateArray; 请注意,我只返回一列。现在我需要在另一个WHERE子句中使用它,这意味着:如果account_id与negateArray中找到的任何一个匹配,则不包括数据 我写的东西像 select * from [some other where clause] WHERE (account_id NOT IN AN

我已将数组变量声明为

select array(select "account_id" from [some where clause]) as negateArray;
请注意,我只返回一列。现在我需要在另一个WHERE子句中使用它,这意味着:如果account_id与negateArray中找到的任何一个匹配,则不包括数据

我写的东西像

select * from [some other where clause] WHERE (account_id NOT IN ANY(negateArray));

但是我得到了一个语法错误。为PostgreSQL编写条件的正确方法是什么?

如果要使用变量,则需要使用过程/函数

首先,将变量定义为negateArray int[]

然后尝试:

select array(select "account_id" from [some where clause]) INTO negateArray;
然后:

select * from [some other where clause] WHERE (account_id <> ANY(negateArray));

为了让优化器尽其所能-将不处于条件的连接转换为左[outer]连接。以下是等效的纯SQL版本重写:

选择t2* 从表t2开始 左连接从内部\u表中选择帐户\u id,其中[内部\u表上的某些where子句]t1 在t2.account\u id=t1.account\u id上 where[外部表格上的其他where子句] t1.account_id为空; t1.account_id为NULL,则不在作业中

编辑 使用[内部]连接和反转条件,等效但更短,可能更有效:

选择t2* 从表t2开始 从内部\u表where NOT[内部\u表上的某些where子句]t1中联接选择帐户\u id 在t2.account\u id=t1.account\u id上 where[外_表上的其他where子句];
选择arrayselect account_id from[some where子句]作为negateArray;这不会创建变量。@Otshavadze您能建议更好的语法将第一个select存储到我可以在第二个select中使用的内容中吗?您是否使用过程/函数来实现这一点?或者这是纯SQL?仅纯SQL,我正在修复一个遗留查询Then no-need变量,您可以使用单个SQL语句来实现,请参阅我的回答中的EDIT。我正在尝试降低查询的复杂性,而该查询目前并没有NOT in子句。它显示了嵌套循环反连接的巨大成本。不过,我想我可以声明一个函数。帐户id是否为外部查询编制了索引?是的indexed@AskarIbragimov在复杂度上,不存在和任何等价物。寻找足够的索引来支持这样的查询。是的,这大大降低了复杂性。很好的建议。尽管在你的第二个例子中,我会特别小心地描述连接的条件。我怀疑反向条件编辑可能很棘手,至少是我在使用第一个示例时得到的正确回答,但可能只有我一个人。
select * from [some other where clause] -- your second query
WHERE account_id NOT IN( 
        select "account_id" from [some where clause] -- your first query
);