2013-11-23 49 views
-2

我有3個表是這樣的:SQL查詢沒有重複

名稱:

ID(K) Name 
-------------- 
1  n1 
2  n2 

喬布斯:

ID  Job 
------------ 
1  j1 
1  j2 

電話:

ID  Phone 
-------------- 
1  p1 
1  p2 
1  p3 
1  p4 

我做了選擇與左外聯接:

SELECT Names.Name, Jobs.Job, Phones.Phone 
FROM 
    Names LEFT OUTER JOIN Jobs ON Jobs.ID = Names.ID 
    LEFT OUTER JOIN Phones ON Phones.ID = Names.ID 

和回報:

n1 j1 p1 
n1 j1 p2 
n1 j1 p3 
n1 j1 p4 
n1 j2 p1 
n1 j2 p2 
n1 j2 p3 
n1 j2 p4 
n2 null null 

,但我需要這樣的結果:

n1 j1 p1 
n1 j2 p2 
n1 null p3 
n1 null p4 
n2 null null 

有什麼解決辦法?

+3

p3/p4應該鏈接到n1而不是n2的原因是什麼? –

+0

結果中沒有重複項。 – Barmar

+0

如何將手機與名稱和工作聯繫起來? –

回答

0

你沒有指定哪個RDBMS,但這個查詢至少在SQL Server,PostgreSQL和Oracle上有效。可能有更智能的分析功能來做到這一點,但目前它逃脫了我。

WITH pjobs AS (
    SELECT id, job, 
    ROW_NUMBER() OVER(PARTITION BY id ORDER BY job) rn FROM jobs 
), pphones AS (
    SELECT id, phone, 
    ROW_NUMBER() OVER(PARTITION BY id ORDER BY phone) rn FROM phones 
) 
SELECT name, job, phone 
FROM pjobs FULL JOIN pphones ON pjobs.rn = pphones.rn AND pjobs.id = pphones.id 
RIGHT JOIN names ON names.id = pjobs.id OR names.id = pphones.id 

An SQLfiddle to test with