Sql Server 2008查询为非现有值放置null

时间:2012-12-20 08:10:46

标签: sql sql-server

以下是两个表{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    

请查看小提琴这个问题 SQLfiddle for Problem

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:5)

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

SELECT 
    Name, 
    (SELECT Contact 
     From Contacts c 
     WHERE c.Type = 'p' And c.PersonId = p.PersonID) 
    As Contact
FROM 
    PERSONS p 

答案 2 :(得分: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 

答案 3 :(得分: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 Reference