2013-07-24 2 views
2

У меня есть эти таблицы в моей базе данных:Sql подзапрос с внутренним соединением

Tourist - это первая таблица

Tourist_ID - primary key 
Extra_Charge_ID - foreign key 

name...etc... 

EXTRA_CHARGES

Extra_Charge_ID - primmary key 
    Excursion_ID - foreign key 

    Extra_Charge_Description 

Tourist_Extra_Charges

Tourist_Extra_charge_ID 

Extra_Charge_ID - foreign key 

Tourist_ID - foreign key 

Бронирование

Reservation_ID - primary key 

..... 

Tourist_Reservations

Tourist_Reservation_ID 

Reservation_ID - foreign key 

Tourist_ID - foreign key 

Так вот мой пример: у меня есть резервирование с Reservaton_ID - 27 Эта оговорка имеет два туриста с Tourist_ID - 86 и Tourist_ID - 87 Этот туристический объект с номером 86 имеет надбавку Extra_Charge_ID - 7 и и Extra_charge_ID - 11;

Можно ли сделать SQL запрос и имя и идентификатор туриста, а затем все его наценки

Таким образом, выход может выглядеть следующим образом:

Tourist_ID : 86 Name:John Extra_Charge_ID - 7 Extra_Charge_ID - 11 


Tourist_ID: 87 Name:Erika 

Extra-Charge_ID:10 

(Здесь запрос я сделал, чтобы получить extra_charge_description всех туристов с Reservation_ID = 27, но я не знаю, как изменить его., чтобы получить вышеуказанные имена)

Select EXTRA_CHARGES.Extra_Charge_Description,TOURIST_EXTRA_CHARGES.Tourist_ID FROM EXTRA_CHARGES 

     INNER JOIN TOURIST_EXTRA_CHARGES on EXTRA_CHARGES.Extra_Charge_ID = TOURIST_EXTRA_CHARGES.Extra_Charge_ID 

INNER JOIN TOURIST_RESERVATION on TOURIST_EXTRA_CHARGES.Tourist_ID = TOURIST_RESERVATION.Tourist_ID 
      INNER JOIN RESERVATIONS on RESERVATIONS.Reservation_ID = TOURIST_RESERVATION.Reservation_ID 
      where RESERVATIONS.Reservation_ID=27 
+0

Я не уверен, в чем вопрос .... Вы спрашиваете, возможно ли иметь строки с различными форматами в SQL-запросе? –

+0

... или, возможно, улучшить ваш запрос? Это в tsql? – Milen

+1

Поле _Extra_Charge_ID_ не должно находиться в вашем ** Туристическом ** столе: вы уже связываете туристов с дополнительными расходами через таблицу ** Tourist_Extra_Charges **. – Josien

ответ

2

Ваша схема базы данных не совсем ясно для меня, но, кажется, вы можете связать туристов из таблицы Tourist их наценки в EXTRA_CHARGES таблица через Tourist_Extra_Charges таблица выглядит следующим образом:

SELECT T.Tourist_ID 
     ,T.Tourist_Name 
     ,EC.Extra_Charge_ID 
     ,EC.Extra_Charge_Description 
FROM Tourist AS T 
INNER JOIN Tourist_Extra_Charges AS TEC ON T.Tourist_ID= TEC.Tourist_ID 
INNER JOIN EXTRA_CHARGES AS EC ON TEC.Extra_Charge_ID = EC.Extra_Charge_ID; 

EDIT

Если вы хотите, чтобы иметь возможность фильтровать по Reservation_ID, вы должны присоединиться к таблицам Tourist_Reservations и Бронирование, а также, как это:

SELECT T.Tourist_ID 
     ,T.Tourist_Name 
     ,EC.Extra_Charge_ID 
     ,EC.Extra_Charge_Description 
FROM Tourist AS T 
INNER JOIN Tourist_Extra_Charges AS TEC ON T.Tourist_ID= TEC.Tourist_ID 
INNER JOIN EXTRA_CHARGES AS EC ON TEC.Extra_Charge_ID = EC.Extra_Charge_ID 
INNER JOIN Tourist_Reservations AS TR ON T.Tourist_ID = TR.Tourist_ID 
INNER JOIN Reservations AS R ON TR.Reservation_ID = R.Reservation_ID 
WHERE R.Reservation_ID = 27; 

Что касается вашей схемы базы данных: обратите внимание, что поле Extra_Charge_ID не обязательно в вашем Tourist стол: вы уже связываете туристов с доплатой через Tourist_Extra_Charges стол. Это может быть опасно для разумности ваших данных, чтобы сделать эти двойные соединения.

+0

Конечно, что Extra_Charge _ID не в моей таблице - я хотел, чтобы вместо него был добавлен EXcursion_ID. спасибо за вашу помощь. Я сделал точно такой же запрос, но теперь я должен подумать, что в каждой строке мошенника появляется имя, чтобы поместить только один раз имя, а затем extra_charges –

+0

Да, ваш первоначальный запрос просто отсутствовал в соединении с * * Туристический ** стол. Звучит так, как будто вы хотите получить результат, например '7, 11' для поля _Extra_Charge_ID_, попробуйте выполнить поиск SO для объединения результатов в строку (например [здесь] (http://stackoverflow.com/questions/2885709/sql -concatenate-rows-query)). – Josien

1

Вы можете иметь его в ограниченном списке с GROUP_CONCAT как:

SELECT Tourist_ID, Name, GROUP_CONCAT(Extra_Charge_ID SEPARATOR ',') 
FROM Tourist 
GROUP BY Tourist_ID 
+0

Спасибо! Но я использовал его с mysql - но теперь я должен сделать это MS SQL! –

0

Вы пишете:

"Этот Турист с идентификатором 86 имеет дополнительные сборы с Extra_Charge_ID - 7 и и Extra_charge_ID - 11;"

Но ваш туристический стол имеет Tourist_ID как первичный ключ, поэтому вы не сможете вставить туриста 86 с двумя разными Extra_Charge_ID.

Решение должно быть связано с удалением Extra_Charge_ID из таблицы Tourist.

У вас уже есть Tourist_Extra_Charges, почему бы не использовать его?

Tourist 
------- 
86 
87 

и

Tourist_Extra_Charges 
--------------- 
1,7,86 
2,11,86 

и т.д.

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