2013-11-23 160 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