在使用IN子句的postgreSql查询中用作表达式的子查询返回的多行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在使用IN子句的postgreSql查询中用作表达式的子查询返回的多行相关的知识,希望对你有一定的参考价值。

我在postgreSql中面临查询问题。以下是查询。

UPDATE t_e20so1_fieldrulethen AS fthen 
SET    c_thenfieldid = t1.c_fieldschemaid 
FROM   t_sys_fieldschema AS t1 
WHERE  fthen.c_lyrathenfieldid = t1.c_lyraid 
   AND fthen.c_rulefor = 5 
   AND t1.c_fieldtype = 18 
   AND t1.c_tablegroupsid IN ( 
       CASE 
         WHEN fthen.c_iffieldid = t1.c_id THEN (SELECT 
         c_targettableid 
         FROM t_sys_tablegroups 
         WHERE c_parentid = 'c0b2f85c-bc93-466b-a54d-b1330440db98') 
         ELSE (SELECT c_targettableid 
               FROM   t_sys_tablegroups 
               WHERE  c_parentid = 
                      'c0b2f85c-bc93-466b-a54d-b1330440db98') 
       END ); 

根据以上查询,我正在从t_e20so1_fieldrulethen更新t_sys_fieldschema表。要检查的条件之一是t_sys_fieldschema.c_tablegroupsid应该具有特定值,并且我从表t_sys_tablegroups获取它们。

上面的查询给出了我的错误,如下所示:

ERROR:  more than one row returned by a subquery used as an expression
SQL state: 21000

在这里,如果我从查询中删除案例(下面是我的意思)它可以正常工作。

UPDATE t_e20so1_fieldrulethen AS fthen 
SET    c_thenfieldid = t1.c_fieldschemaid 
FROM   t_sys_fieldschema AS t1 
WHERE  fthen.c_lyrathenfieldid = t1.c_lyraid 
   AND fthen.c_rulefor = 5 
   AND t1.c_fieldtype = 18 
   AND t1.c_tablegroupsid IN (SELECT c_targettableid 
                              FROM   t_sys_tablegroups 
                              WHERE 
           c_parentid = 'c0b2f85c-bc93-466b-a54d-b1330440db98') 

现在我在“IN”子句中只有一个选择查询。

答案

我已经检查了那种case语句(两个嵌套选择) - 并且不能这样做。您在一个CASE中生成两个单独的列表。所有记录的一个列表,其中fthen.c_iffieldid = t1.c_id,另一个列表用于ELSE语句。

正如我多次写的那样,从不在“IN”子句中使用嵌套选择。它正在扼杀性能并造成许多问题。使用“EXISTS”。由于你的CASE似乎是多余的(WHEN和ELSE都返回相同的值)改变它的方式,它会更快。

UPDATE t_e20so1_fieldrulethen AS fthen 
   SET c_thenfieldid = t1.c_fieldschemaid 
  FROM t_sys_fieldschema AS t1 
 WHERE fthen.c_lyrathenfieldid = t1.c_lyraid 
   AND fthen.c_rulefor = 5 
   AND t1.c_fieldtype = 18 
   AND exists (select from t_sys_tablegroups t2 
                where t1.c_tablegroupsid=t2.c_targettableid
                  and  c_parentid = 'c0b2f85c-bc93-466b-a54d-b1330440db98');

以上是关于在使用IN子句的postgreSql查询中用作表达式的子查询返回的多行的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL--with子句

IN() 子句中的 PostgreSQL ORDER BY 值

4.2. PostgreSQL值表达式

使用 JDBCTemplate 在“IN”子句中将 List<String> 作为查询参数传递时获取 PSQL 异常

oracle sql查询中用in列表中最大表达式数大于1000的处理

oracle sql查询中用in列表中最大表达式数大于1000的处理