2

ここに2つのテーブルがあります{ PERSONS, CONTACTS}

これらの2つのテーブルから次の結果が必要です

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    

この問題についてはフィドルをご覧ください 。SQLfiddleforProblem

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

もう 1 つの珍しい方法 ;) これは最善の方法ではありません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 に答える