Oracle 子查询返回多行
我有两个表,我正试图从中提取信息。这是下表的一个示例,因为它们是大型表。 通过查看表2,我希望表1上的描述是关于列KEY_事件的,唯一的公共列是APP列。 但错误已经到来,子查询不能返回多行Oracle 子查询返回多行,oracle,Oracle,我有两个表,我正试图从中提取信息。这是下表的一个示例,因为它们是大型表。 通过查看表2,我希望表1上的描述是关于列KEY_事件的,唯一的公共列是APP列。 但错误已经到来,子查询不能返回多行 TABLE 1 APP LANGUAGE DESCRIPTION 195 12 Involved person 195 27 Involved person 196 1 Invol
TABLE 1
APP LANGUAGE DESCRIPTION
195 12 Involved person
195 27 Involved person
196 1 Involvert legemiddel
196 2 Involved drug
196 3 Involverad lakemedel
196 4 Involveret l?gemiddel
196 12 Involved drug
196 27 Involved drug
197 1 Eksponeringsverdier
197 2 Exposure values
197 3 Exponeringsvarden
197 4 Eksponeringsv?rdier
197 12 Exposure values
197 27 Exposure values
198 1 Indikatorer
198 2 Indicators
198 3 Indikatorer
198 4 Indikatorer
198 12 Indicators
198 27 Indicators
199 1 Generell klassifisering
199 2 General classification
199 3 Generell klassificering
199 4 Generel klassifisering
199 12 General classification
199 27 General classification
TABLE 2
TRANS APP
1 195
2 195
3 196
4 196
5 196
6 196
7 196
8 196
9 197
10 197
11 197
12 197
13 197
14 197
15 198
16 198
17 198
18 198
19 198
20 198
21 199
22 199
23 199
24 199
25 199
26 199
此外,我想使用-如果我们有多个描述的公共appl,我想使用LISTAGG连接描述
SELECT SELECT NVL(TO_CHAR(TRANS.ID), 'NULL') AS ID
, 'HEADER'
,NVL(TO_CHAR((SELECT L_APP.DESCRIPTION
FROM L_APP L_APP
WHERE EXISTS ( SELECT 1 FROM TRANS WHERE L_APP.APP = TRANS.APP AND LANGUAGE = 2
)
)), 'NULL') AS KEY_EVENT
您需要使用聚合来合并行。不能在一个单元格中显示所有行。 因此,LISTAGG是您要查找的关于字符串的内容 以下是一个查询示例:
SELECT
NVL(TO_CHAR(TRANS.ID), 'NULL') AS ID,
'HEADER',
NVL(
TO_CHAR(
(
SELECT LISTAGG ( L_APP.DESCRIPTION ,',' )
FROM L_APP
WHERE EXISTS (
SELECT 1
FROM TRANS
WHERE L_APP.APP = TRANS.APP AND LANGUAGE = 2
)
)
), 'NULL'
) AS KEY_EVENT
据我所知,您需要以英文(
language=2
)作为列KEY\u EVENT
进行描述,还需要以其他语言列出所有现有描述。请看这个语法。我还附上了一个演示,演示了此查询如何处理您提供的数据
select trans, t2.app,
nvl(max(case when language = 2 then description end), 'NULL') key_event,
listagg(description, ', ') within group (order by t1.language) list
from table2 t2
left join table1 t1 on t1.app = t2.app
group by trans, t2.app
order by trans;
看起来12
和27
也是英文描述,如果您想使用它们(如果2
不存在),请运行以下命令:
select trans, t2.app,
coalesce(max(case when language = 2 then description end),
max(case when language = 12 then description end),
max(case when language = 27 then description end),
'NULL') key_event,
listagg(description, ', ') within group (order by t1.language) list
from table2 t2
left join table1 t1 on t1.app = t2.app
group by trans, t2.app
order by trans;
我已经能够在本页中使用此答案,itt在连接到一个文件中的过程中没有创建任何副本: 最后的代码是
select app, key_event, xmlquery('distinct-values(//text())' passing xmldoc returning content).getclobVal()
from (
select t2.app,
coalesce(max(case when language = 2 then description end),
max(case when language = 12 then description end),
max(case when language = 27 then description end),
'NULL') key_event,
XMLELEMENT(root,xmlagg(XMLELEMENT(e,description,','))
) xmldoc
from table2 t2
left join table1 t1 on t1.app = t2.app
group by trans, t2.app
order by trans);
A把这个问题读了好几遍,但我还是不明白你到底想要什么。你能添加输入和相应的期望输出吗?我想得到基于公共列的值描述。但是我从第8行得到这个错误“缺少%s关键字”,它来自L_APPThank you Pounder。我用的是第一个。查询的意思是,我在group(order by t1.language)列表中的这一行listagg(description,“,”)中有很多值。如果您的意思是字符串连接的结果太长,那么您不能使用
listagg()
,或者您必须使用中的一个解决方案。Pounder,这不是字符串连接的结果。该行抱怨的是,实际上太多的值是nvl(max(当语言=2时,则说明结束),'NULL')key_事件,对不起,但我不明白。我向你们展示了解决方案,我向你们展示了如何处理你们自己的数据。请阅读。这是工作,但正在创建重复,也不能很容易地适应其他代码我有