由使用 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_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');

相关内容

  • 没有找到相关文章

最新更新