使用外键进行SQL查询

时间:2013-08-27 12:08:14

标签: sql oracle10g

我需要一些帮助编写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'

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

1 个答案:

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