0

我需要一些帮助来编写 SQL 查询。我不知道如何用语言表达,所以我向你展示我想要的最好的方式就是举个例子。(我正在使用 Oracle 10)

我有 2 张桌子:

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'

如何编写查询以获得所需的结果?另外,如果有此类查询的名称,请告诉我。我敢肯定有人以前已经做过这样的事情,但我只是不知道它叫什么,因此不知道要搜索什么。

4

1 回答 1

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() 不受支持,但可用(虽然还有很多其他字符串聚合技术

如果您确实对您拥有(或想要返回)的职责数量有上限,那么枢轴查询将如下所示:

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() 只是为了生成一个易于使用的密钥,因为职责本身可以是任何东西。

于 2013-08-27T12:15:19.027 回答