我在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_sys_fieldschema
更新t_e20so1_fieldrulethen
表。要检查的条件之一是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 中生成两个单独的列表。 一个列表用于 fthen.c_iffieldid = t1.c_id 的所有记录,另一个列表用于 ELSE 语句。
正如我多次写的那样,从不在"IN"子句中使用嵌套选择。它正在扼杀性能并导致许多问题。使用"存在"。 由于您的 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');