在使用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查询中用作表达式的子查询返回的多行的主要内容,如果未能解决你的问题,请参考以下文章
IN() 子句中的 PostgreSQL ORDER BY 值
使用 JDBCTemplate 在“IN”子句中将 List<String> 作为查询参数传递时获取 PSQL 异常