我的数据集如下:
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:单行子查询返回多行。
请帮忙。
答案 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;
上述查询的作用是内部相关查询在不同的列中返回相应的min
和max
值,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 强>