2013-06-24 5 views
4

У меня есть три таблицы под названием «Гость», «Гость_Address» и «Acutal_Address». Guest_Address является связующим столом между гостевым и acutal_address. Это то, что у меня есть до сих пор.Три способа присоединиться к sql

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_address, но мне нужно присоединиться Гость и Acutal_Address. Вот ERD. enter image description here

ответ

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. Если вы хотите, чтобы он возвращал детали гостя независимо от адреса, вы можете просто изменить JOIN на LEFT JOIN

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 для фильтрации высаживать на меньший (суб-набор), в случае необходимости

Смежные вопросы