ora-01427单行子查询在select语句中返回错误

时间:2017-10-09 07:24:02

标签: sql oracle

我的数据集如下:

ID  keyword1
1   abc
2   abc1
1   xyz
3   hjh
3   pou

我想要输出如下:

ID  keyword1  keyword2
1   abc       xyz
2   abc1
3   hjh       pou

条件是:如果特定ID的行数超过1行,那么我应该在同一个ID行中获得另一列关键字。如果没有匹配的行,那么它应该为null。

我正在使用以下查询:

select c.ID,
    (select KEYWORD from table1 a where a.ECF_RULE_ID=c.ECF_RULE_ID) as  KEYWORD1,
    (select KEYWORD from table2 b where b.ECF_RULE_ID=c.ECF_RULE_ID) as KEYWORD2
from table3 c

但我得到的错误是:

  

ORA-01427:单行子查询返回多行。

请帮忙。

3 个答案:

答案 0 :(得分:0)

看起来你需要像;

select
c.ID,
a.keyword as KEYWORD1,
b.keyword as KEYWORD2

from
table3 c
LEFT JOIN table1 a ON a.ECF_RULE_ID=c.ECF_RULE_ID
LEFT JOIN table2 b ON b.ECF_RULE_ID=c.ECF_RULE_ID

请查看联接,它非常强大。

答案 1 :(得分:0)

如果你有两个以上的ID值,你可以尝试另一种方式,使用"解析窗口功能"喜欢等级

select
    ECF_RULE_ID as ID,
    KEYWORD,
    rank() over (partition by ECF_RULE_ID order by KEYWORD ) as POSITION
from
    table1

结果:

ID  KEYWORD  POSITION
1   abc      1
1   xyz      2
2   abc1     1
3   hjh      1
3   pou      2

答案 2 :(得分:0)

我认为您正在尝试使用相关查询来返回您想要的结果,如下所示。

SELECT id
    ,keyword1
    ,CASE 
        WHEN keyword2 <> keyword1
            THEN keyword2
        ELSE NULL
        END AS keyword2
FROM (
    SELECT DISTINCT c.id
        ,(
            SELECT min(keyword)
            FROM t1 a
            WHERE a.ID = c.ID
            ) AS Keyword1
        ,(
            SELECT max(keyword)
            FROM t1 b
            WHERE b.ID = c.ID
            ) AS Keyword2
    FROM t1 c
    ) t
order by id;

上述查询的作用是内部相关查询在不同的列中返回相应的minmax值,distinct删除重复项和case强制{{1}如果值与keyword2值匹配,则为NULL的值。

<强>结果:

keyword1

您可以查看演示 here

更新1:

您也可以使用下面的id keyword1 keyword2 ------------------------ 1 abc xyz 2 abc1 3 hjh pou 来获得所需的结果。

left join

<强>结果:

SELECT id
    ,keyword1
    ,CASE 
        WHEN keyword2 <> keyword1
            THEN keyword2
        ELSE NULL
        END AS keyword2
FROM (
    SELECT a.id
        ,max(a.keyword) AS keyword1
        ,min(b.keyword) AS keyword2
    FROM t1 a
    LEFT JOIN t1 b ON a.id = b.id
    GROUP BY a.id
    ) t
ORDER BY id;

<强> DEMO