我需要一些帮助编写SQL查询。我不知道如何用文字表达,所以最好的方式让我向你展示我想要的是一个例子。 (我使用的是Oracle 10)
我有两张桌子:
Employees (2 fields):
e_id e_name
1 Joe
2 Tom
3 Fred
Duties (2 fields)
e_id e_duty
1 'Clean Floor'
1 'Paint Walls'
2 'Lawn care'
3 'Walk Dog'
3 'Paint Fence'
3 'Cook Dinner'
我想要得到的结果如下:
Joe 'Clean Floor' 'Paint Walls'
Tom 'Lawn Care'
Fred 'Walk Dog' 'Paint Fence' 'Cook Dinner'
如何编写查询以获得所需的结果?此外,如果有此类查询的名称,请告诉我。我相信那里的人之前已经做过这样的事情,但我只是不知道它叫什么,因此不知道要搜索什么。
答案 0 :(得分:1)
如果您希望在单独的列中完成所有职责,除非已知上限,否则这几乎是不可能的。如果是这种情况,我会使用PIVOT查询。
如果你不介意他们都在同一列,你可以做这样的事情:
select name, wm_concat(e_duty)
from employees e
join duties d
on e.e_id = d.e_id
group by name
WM_CONCAT()不受支持但可用(there are plenty of other string aggregation techniques though)
如果您的职责数量确实有上限(或想要返回),那么数据透视查询将如下所示:
select e_name, "1", "2", "3", "4", "5", "6"
from employees e
join ( select e_id, duty
, row_number() over ( partition by e_id order by 1 ) as r
from duties ) d
on e.e_id = d.e_id
pivot ( max(duty) for r in (1, 2, 3, 4, 5, 6 )
)
ROW_NUMBER()仅用于生成一个易于使用的密钥,因为任务本身可以是任何东西。