我有一个简单的查询:
select * from countries
Run Code Online (Sandbox Code Playgroud)
结果如下:
country_name
------------
Albania
Andorra
Antigua
.....
Run Code Online (Sandbox Code Playgroud)
我想在一行中返回结果,所以像这样:
Albania, Andorra, Antigua, ...
Run Code Online (Sandbox Code Playgroud)
当然,我可以编写一个PL/SQL函数来完成这项工作(我已经在Oracle 10g中完成了),但是对于这个任务是否有更好的,最好是非特定于Oracle的解决方案(或者可能是内置函数) ?
我通常会用它来避免子查询中的多行,所以如果一个人有一个以上的公民身份,我不希望她/他在列表中是重复的.
我的问题是基于SQL Server 2005上的类似问题.
更新:我的功能如下:
CREATE OR REPLACE FUNCTION APPEND_FIELD (sqlstr in varchar2, sep in varchar2 ) return varchar2 is
ret varchar2(4000) := '';
TYPE cur_typ IS REF CURSOR;
rec cur_typ;
field varchar2(4000);
begin
OPEN rec FOR sqlstr;
LOOP
FETCH rec INTO field;
EXIT WHEN rec%NOTFOUND;
ret := ret || field || sep;
END LOOP;
if length(ret) …
Run Code Online (Sandbox Code Playgroud) 我有两张桌子:
TableA
------
ID,
Name
TableB
------
ID,
SomeColumn,
TableA_ID (FK for TableA)
Run Code Online (Sandbox Code Playgroud)
这种关系是一排TableA
- 许多TableB
.
现在,我希望看到这样的结果:
ID Name SomeColumn
1. ABC X, Y, Z (these are three different rows)
2. MNO R, S
Run Code Online (Sandbox Code Playgroud)
这不起作用(子查询中有多个结果):
SELECT ID,
Name,
(SELECT SomeColumn FROM TableB WHERE F_ID=TableA.ID)
FROM TableA
Run Code Online (Sandbox Code Playgroud)
如果我在客户端进行处理,这是一个微不足道的问题.但这意味着我必须在每个页面上运行X查询,其中X是结果的数量TableA
.
请注意,我不能简单地执行GROUP BY或类似的操作,因为它将为行返回多个结果TableA
.
我不确定使用COALESCE或类似东西的UDF是否可行?
我有一个看起来像这样的表:
A 1
A 2
B 1
B 2
Run Code Online (Sandbox Code Playgroud)
我想生成一个如下所示的结果集:
A 1 2
B 1 2
Run Code Online (Sandbox Code Playgroud)
是否有SQL语句可以执行此操作?我正在使用Oracle.
相关问题:
我不确定这里发生了什么,主要是因为我从未使用过这个函数,但是当我在Oracle 11g数据库上使用listagg函数时,它给了我一个未找到的ORA-00923 FROM关键字.
这是我的SQL
SELECT cdm.courses_id,cde.additional_resources, listagg (dm.delivery_method_desc, ',')
WITHIN GROUP (ORDER BY dm.delivery_method_desc) delivery_methods
FROM tablespace.course_de_delivery_methods cdm,
tablespace.course_distance_ed cde,
tablespace.delivery_methods dm
WHERE cdm.courses_id = cde.courses_id
AND cdm.delivery_methods_id = dm.delivery_methods_id
GROUP BY cdm.courses_id
Run Code Online (Sandbox Code Playgroud)