如何在SQL子选择中使用order by?
我有一个名为ConcatList的聚合函数,它将一个值列表连接成一个逗号分隔的值 下面是我正在尝试做的一个例子。我有两张桌子:雇员和工作。乔布斯是员工的“孩子”。我需要获得一个员工列表,其中包括一个以逗号分隔的与员工相关的工作列表,按工作名称排序 我想我可以做到这一点:如何在SQL子选择中使用order by?,sql,oracle,oracle10g,sql-order-by,subquery,Sql,Oracle,Oracle10g,Sql Order By,Subquery,我有一个名为ConcatList的聚合函数,它将一个值列表连接成一个逗号分隔的值 下面是我正在尝试做的一个例子。我有两张桌子:雇员和工作。乔布斯是员工的“孩子”。我需要获得一个员工列表,其中包括一个以逗号分隔的与员工相关的工作列表,按工作名称排序 我想我可以做到这一点: select em.EmployeeId, em.EmployeeName, (select ConcatList(jo.JobName) from Job jo
select em.EmployeeId,
em.EmployeeName,
(select ConcatList(jo.JobName)
from Job jo
where jo.EmployeeId = em.EmployeeId
order by jo.JobName)
from Employee em;
但是,这会在“order by”子句中返回以下错误:
如果我去掉了“orderby”子句,这个SQL就可以工作,但是我需要对作业列表进行排序
如何实现这一点?由于
ConcatList
是一个用户定义的聚合函数,因此修改ConcatList
对结果排序或创建一个ConcatSortedList
聚合函数对其聚合的数据进行排序似乎是有意义的。加里·迈尔斯(Gary Myers)就是一个例子
你也可以浏览Tim Hall网站上的各种网站。如果您必须生成一个排序列表,那么使用其中的许多技术将比试图保证非排序用户定义的聚合函数生成排序结果更容易。例如,当需要排序时,相对容易使用,因为您只需向光标添加一个
ORDER BY
。因为ConcatList
是一个用户定义的聚合函数,修改ConcatList
对结果进行排序,或者创建一个ConcatSortedList
聚合函数对它聚合的数据进行排序,这似乎是有意义的。加里·迈尔斯(Gary Myers)就是一个例子
select em.EmployeeId,
em.EmployeeName,
wm_concat(jo.JobName) over
(partion by jo.EmployeeID order by JobName) as JobList
from Employee em
INNER JOIN JOB JO on jo.EmployeeId = em.EmployeeId
你也可以浏览Tim Hall网站上的各种网站。如果您必须生成一个排序列表,那么使用其中的许多技术将比试图保证非排序用户定义的聚合函数生成排序结果更容易。例如,当需要排序时,相对容易使用,因为您只需向光标添加一个orderby
select em.EmployeeId,
em.EmployeeName,
wm_concat(jo.JobName) over
(partion by jo.EmployeeID order by JobName) as JobList
from Employee em
INNER JOIN JOB JO on jo.EmployeeId = em.EmployeeId
我认识到wm_concat是一个分析-->
Text2=随机文本
val=分组
Select val, text2, wm_concat(text2) over (partition by val order by text2) as out_text2
from B
Test results:
VAL text2 out_Text2
1 XXX010105 (CLOB) XXX010105
1 something XXX010101 somet (CLOB) XXX010105,...
2 yet another XXX010102 and (CLOB) yet anothe...
4 XXX010103 (CLOB) XXX010103
5 a (CLOB) a
5 b (CLOB) a,b
5 c (CLOB) a,b,c
5 x (CLOB) a,b,c,x
6 a (CLOB) a
6 g (CLOB) a,g
6 i (CLOB) a,g,i
6 n (CLOB) a,g,i,n
6 x (CLOB) a,g,i,n,x
我认识到wm_concat是一个分析-->
Text2=随机文本
val=分组
Select val, text2, wm_concat(text2) over (partition by val order by text2) as out_text2
from B
Test results:
VAL text2 out_Text2
1 XXX010105 (CLOB) XXX010105
1 something XXX010101 somet (CLOB) XXX010105,...
2 yet another XXX010102 and (CLOB) yet anothe...
4 XXX010103 (CLOB) XXX010103
5 a (CLOB) a
5 b (CLOB) a,b
5 c (CLOB) a,b,c
5 x (CLOB) a,b,c,x
6 a (CLOB) a
6 g (CLOB) a,g
6 i (CLOB) a,g,i
6 n (CLOB) a,g,i,n
6 x (CLOB) a,g,i,n,x
您可以对关联的记录进行排序,然后聚合结果:
select EmployeeId,
EmployeeName,
ConcatList(JobName)
from (
select em.EmployeeId,
em.EmployeeName,
jo.JobName
from Employee em
join Job jo
on jo.EmployeeId = em.EmployeeId
order by jo.JobName
)
group by EmployeeId,
EmployeeName
您可以对关联的记录进行排序,然后聚合结果:
select EmployeeId,
EmployeeName,
ConcatList(JobName)
from (
select em.EmployeeId,
em.EmployeeName,
jo.JobName
from Employee em
join Job jo
on jo.EmployeeId = em.EmployeeId
order by jo.JobName
)
group by EmployeeId,
EmployeeName
如果在from子句中使用distinct关键字,则此解决方案有效。如果在from子句中使用distinct关键字,则此解决方案有效。