2013-08-27 116 views
0

我需要一些幫助編寫SQL查詢。我不知道如何用文字表達,所以我最好的方式是向我展示我想要的是一個例子。 (我用的是Oracle 10)SQL查詢與外鍵

我有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' 

我如何編寫一個查詢來獲取想要的結果?此外,如果有這種類型的查詢的名稱,請讓我知道。我確定有人在那之前已經做過這樣的事情,但我只是不知道它被稱爲什麼,因此不知道要搜索什麼。

回答

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()不僅有牛逼o產生一個簡單的鑰匙作爲責任本身可以是任何東西。

+0

我其實在我的真實世界中有一個上限。 6是員工能承擔的最大責任。 – carlg

+0

在這種情況下,我對PIVOT所做的工作將會起作用;我剛剛更新了它,與您的要求@ user1031516完全相同。 – Ben