小编典典

SQL从具有不同类型(移动电话,家庭电话)的多对多表中选择电话号码

sql

我有一个简单的表架构:

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

关于我如何处理此问题的任何提示?

注意:这些表是较大模式的摘录,它解释了为什么这么多对多而不简单的原因。


阅读 187

收藏
2021-04-28

共1个答案

小编典典

如果您有多个数字或可能有多个家庭/移动电话,则可以用更复杂的方式执行此操作,但是目前,如果只有两个数字,则可以使用:

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映射设为aJOIN而不是aLEFT JOIN

2021-04-28