2

単純なテーブルスキーマがあります。

Person: ID, Name
PhoneNumber: ID, Type, Number                    #Type can be 'home' or 'mobile'.
PersonPhoneNumber: ID, Person_ID, PhoneNumber_ID #A join table that connects the
                                                 #person to a phone number.

私が持っているデータとして:

Person: 1, "Ed"
PhoneNumber: 1, "home", 1111
PhoneNumber: 2, "mobile", 2222
PersonPhoneNumber: 1, 1 /*(Person_ID)*/, 1 /*(PhoneNumber_ID*/
PersonPhoneNumber: 2, 1 /*(Person_ID)*/, 2 /*(PhoneNumber_ID*/

次を返すビューを書きたい:

Name    |Home    |Mobile
-----------------------------
"Ed"     1111     2222
"Joe"    3333     4444
... etc

これにアプローチするためのヒントはありますか?

注:これらのテーブルは、より大きなスキーマからのスニペットであり、多対多であり、より単純ではない理由を説明しています。

4

4 に答える 4

1

複数の番号がある場合、または自宅や携帯電話よりも多い場合は、より複雑な方法でこれを行うことができますが、今のところ、番号が2つしかない場合は、次のように機能します。

SELECT Name, HomeNumber.Number AS Home, MobileNumber.Number AS Mobile
FROM Person
    LEFT JOIN PersonPhoneNumber HomeMap
        ON Person.ID = HomeMap.Person_ID
    LEFT JOIN PhoneNumber HomeNumber
        ON HomeMap.PhoneNumber_ID = HomeNumber.ID AND HomeNumber.Type = 'home'
    LEFT JOIN PersonPhoneNumber MobileMap
        ON Person.ID = MobileMap.Person_ID
    LEFT JOIN PhoneNumber MobileNumber
        ON MobileMap.PhoneNumber_ID = MobileNumber.ID AND MobileNumber.Type = 'mobile'

ところで、あなたがどんな数の人々も欲しくないなら、あなたはPersonPhoneNumberマッピングをJOIN代わりに作ることができますLEFT JOIN

于 2012-04-17T17:49:57.173 に答える
0
select  p.Name
,       pnh.Number as Home
,       pnm.Number as Mobile
from    Person p
left join 
        PersonPhoneNumber pn
on      pn.Person_ID = p.ID
left join    
        PhoneNumber pnh
on      pnh.ID = pn.PhoneNumber_ID
        and phh.Type = 'home'
left join    
        PhoneNumber pnm
on      pnm.ID = pn.PhoneNumber_ID
        and pnm.Type = 'mobile'
于 2012-04-17T17:50:14.553 に答える
0

お役に立てれば


SELECT DISTINCT P.NAME,
                (SELECT DISTINCT PN1.PH_NUMBER
                   FROM PHONE_NUMBER PN1
                  WHERE PN1.ID = PN.ID
                    AND PN1.TYPE = 'Home') AS HOME,
                (SELECT DISTINCT PN1.PH_NUMBER
                   FROM PHONE_NUMBER PN1
                  WHERE PN1.ID = PN.ID
                    AND PN1.TYPE = 'Mobile') AS MOBILE
  FROM PERSON P, PHONE_NUMBER PN
  ORDER BY P.NAME

于 2012-04-18T04:12:09.670 に答える
0

これはあなたを助けます

select * from @Person p
left join @PersonPhoneNumber ppn
on p.ID = ppn.PersonID
right join @PhoneNumber pn
on ppn.PhoneNoID = pn.ID
于 2012-04-18T13:20:00.413 に答える