简单SQL返回“错误:用作表达式的子查询返回的多行”

时间:2013-07-18 16:36:46

标签: sql postgresql-9.1

我研究了这些链接:

More than one row returned by a subquery in simple SQL

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

DatabaseError: more than one row returned by a subquery used as an expression (Django)

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

`single-row subquery returns more than one row` error unclarity

...但是它们似乎在查询中使用了各种类型的过滤,或者它们具有子选择,当预期有一行时返回多行。我的查询更简单,不应该只期望返回一行(从我可以告诉)。我只想使用postgresql-9.1从视图中选择所有内容:

# select * from MYVIEW;
ERROR:  more than one row returned by a subquery used as an expression

虽然这有效:     # SELECT COUNT(*) FROM MYVIEW; count ------- 5 (1 row)

这里是我视图的一般定义(请注意,以下内容仅供参考我选择的内容,而不是接收错误的内容。仅在运行'select all'时才会收到错误上面贴出):

CREATE VIEW MYVIEW(ID1, ID2, ID3, KEY1, KEY2, ID4, TXT1, ID5, LOC1) AS 
SELECT 
    TABLE1.ID1, 
    (SELECT VALUE FROM TABLE2 WHERE TABLE3.TABLE3_ID = TABLE2.TABLE3_ID AND NAME = 'blah1' ) as ID2,
    (SELECT VALUE FROM TABLE2 WHERE TABLE3.TABLE3_ID = TABLE2.TABLE3_ID AND NAME = 'blah2' ) as ID3,
    (SELECT VALUE FROM TABLE2 WHERE TABLE3.TABLE3_ID = TABLE2.TABLE3_ID AND NAME = 'blah3') as KEY1,
    (SELECT VALUE FROM TABLE2 WHERE TABLE3.TABLE3_ID = TABLE2.TABLE3_ID AND NAME = 'blah4') as KEY2, 
    TABLE4.ID6,
    TABLE4.NAME,
    ID5,
    coalesce(
        (SELECT VALUE FROM TABLE5 WHERE TABLE5.ID5 = TABLE6.ID5 AND NAME = 'BLAH5'), 
        (SELECT VALUE FROM TABLE7 WHERE TABLE7.ID6 = TABLE6.ID6 AND NAME = 'BLAH5' )
    ) as LOC1 
FROM TABLE3, TABLE6, TABLE1, TABLE4, TABLE8 
WHERE 
    TABLE3.TABLE8_ID = TABLE8.TABLE8_ID AND 
    TABLE3.ID1 = TABLE1.ID1 AND 
    TABLE8.TABLE8_ID = TABLE4.TABLE8_ID AND 
    TABLE4.ID6 = TABLE6.ID6 AND 
    TABLE6.TABLE3_ID = TABLE3.TABLE3_ID and 
    TABLE8.NAME = 'BLAH6' and 
    TABLE8.on = true and 
    TABLE4.ON = true and 
    TABLE6.ON = true and 
    TABLE1.ON = true AND 
    TABLE3.ON = TRUE;

2 个答案:

答案 0 :(得分:2)

我的猜测是,你没有深入研究你发布的代码blob,你的代码中嵌入了一个SUB-SELECT语句,试图选择多个列。使用SUB-SELECT(嵌套在查询中的SELECT),您只能将一列返回到外部查询。

答案 1 :(得分:1)

事实证明,“子查询返回的多行”消息的来源是视图中有重复的条目。从视图的源表中删除冗余记录后,不会遇到错误。