我有三个名为“Guest”,“Guest_Address”和“Acutal_Address”的表。 Guest_Address是guest和acutal_address之间的链接表。 这就是我到目前为止所拥有的。
SELECT GUEST_ADDRESS.ADDRESS_CODE,(GUEST_FNAME+' '+GUEST_LNAME) AS GUEST_NAMES
FROM GUEST JOIN GUEST_ADDRESS
ON GUEST.ADDRESS_NUM = GUEST_ADDRESS.ADDRESS_NUM;
这只会加入Guest和Guest_address表,但我需要加入Guest和Acutal_Address。 这是ERD。
答案 0 :(得分:10)
您要做的是对actual_address表进行额外的连接,如下所示:
SELECT GUEST_ADDRESS.ADDRESS_CODE,(GUEST_FNAME+' '+GUEST_LNAME) AS GUEST_NAMES
FROM GUEST
JOIN GUEST_ADDRESS ON GUEST.ADDRESS_NUM = GUEST_ADDRESS.ADDRESS_NUM
JOIN ACTUAL_ADDRESS ON GUEST_ADDRESS.ADDRESS_CODE = ACTUAL_ADDRESS.ADDRESS_CODE
介意我问为什么你有这个链接表?客人可以有多个地址吗?如果是这种情况,我会根据GUEST_ADDRESS
而不是GUEST
将联接从GUEST_ID
更改为ADDRESS_NUM
,因为使用ADDRESS_NUM
会使两者之间的关系变为表一对一关系而不是一对多
另外值得注意的是,如果由于ACTUAL_ADDRESS
GUEST_ADDRESS
表中的JOIN
表或链接中没有地址,则上述查询将不会返回guest虚拟机的记录。如果您希望它返回访客详细信息,无论地址如何,您只需将JOIN
更改为LEFT JOIN
答案 1 :(得分:2)
Guest
和ActualAddress
之间通过辅助表格GuestAddress
存在多对多关系。所以加入然后一起进入一组做:
select *
from Guest
left join GuestAddress on GuestAddress.Guest_ID = Guest.Guest_ID
left join ActualAddress on ActualAddress.AddressCode = GuestAddress.Address_Code
然后使用where
子句将设置过滤为较小的一个(子集),如果需要的话