2

这是两个表{ PERSONS, CONTACTS}

我想要这两个表的以下结果

PersonID | Name
1        |  A
2        |  B
3        |  C
4        |  D
5        |  E

Contacts

ContactID | PersonID | Type | Contact 
1         | 1        |  p   | 051-001
2         | 1        |  e   | A@    
3         | 2        |  p   | 051-002
4         | 2        |  e   | B@
5         | 3        |  p   | 051-003
6         | 4        |  p   | 051-004
7         | 4        |  e   | D@

期望的结果输出:

Name | Contact
A    |  051-001
B    |  051-002
C    |  051-003
D    |  051-004
E    |  NULL    

请查看此问题的 Fiddle SQLfiddle for Problem

4

4 回答 4

6

这里是。您是否需要左连接才能从Persons. 此外,在on条件下,您可以过滤Type = 'c'

SELECT P.Name, C.Contact
FROM PERSONS  P
left outer join CONTACTS C
   on C.Type = 'p' and
      P.PersonId = C.PersonId
order by P.Name
于 2012-12-20T08:16:44.543 回答
5

也不知道为什么你不想要左连接,但这是使用子查询。

SELECT 
    Name, 
    (SELECT Contact 
     From Contacts c 
     WHERE c.Type = 'p' And c.PersonId = p.PersonID) 
    As Contact
FROM 
    PERSONS p 
于 2012-12-20T08:24:10.413 回答
4
Select p.Name, c.Contact
from Persons p
left join Contacts c
on p.PersonId = c.Personid
Where Type = 'p' or c.Contact is null 
Order by p.Name 
于 2012-12-20T08:14:51.693 回答
2

另一种不寻常的方法;)这不是最好的regexp。但它可以为您的情况工作。

select distinct p.name,  c.contact
from 
persons p
left join
contacts c
on p.personid = c.personid
where c.contact is null or
c.contact like '[0-9]%'
;

结果:

NAME    CONTACT
A       051-001
B       051-002
C       051-003
D       051-004
E       (null)

* SQLFIDDLE 参考

于 2012-12-20T08:41:47.680 回答