我有一个简单的表架构:
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
关于我如何处理此问题的任何提示?
注意:这些表是较大模式的摘录,它解释了为什么这么多对多而不简单的原因。
如果您有多个数字或可能有多个家庭/移动电话,则可以用更复杂的方式执行此操作,但是目前,如果只有两个数字,则可以使用:
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
PersonPhoneNumber
JOIN
LEFT JOIN