/ / Як скористатися внутрішнім з'єднанням і перехресним об'єднанням в одному запиті? - sql, join, internal-join, cross-join

Як використовувати внутрішній зв'язок та перехресні об'єднання в одному запиті? - sql, join, internal-join, cross-join

У мене є завдання написати запит, який використовує єдине внутрішнє приєднання і перехресне з'єднання. Запит, який я вже написав, має повертати той самий результат, виглядає так:

SELECT T.PRICE, S.ROW, S.NUMBER, M.TITLE
FROM
[cinema_no_keys].[dbo].[TICKET] T cross join
[cinema_no_keys].[dbo].[MOVIE] M cross join
[cinema_no_keys].[dbo].[SEAT] S cross join
[cinema_no_keys].[dbo].[SHOW] SH
WHERE
T.ID_SEAT = S.ID_SEAT AND
M.ID_MOVIE = SH.ID_MOVIE AND
SH.DATE_HOUR = T.DATE_HOUR

Відповіді:

6 за відповідь № 1

cross join це особливий випадок inner join: це внутрішнє з'єднання без будь-яких умов. Іншими словами, він приєднується до кожного рядка таблиці. Єдина причина, що вона існує, так це те, що ви не повинні писати дурний вислів inner join TABLE on 1=1.

Ти повинен тільки використовуйте перехресне з'єднання, якщо ви хочете приєднатися до кожного рядка. Немає сенсу користуватися нею, а потім мати умови в where вказує, які рядки повинні відповідати (як ви робите).

Правильний спосіб зробити це - використання inner joinі вкажіть умови приєднання до on замість статті where пункт. Це надає вашому запиту більше логічного потоку, і в багатьох випадках це також буде більш ефективним (чим раніше ви виключаєте рядки з результату, тим швидше виконується ваш запит).

Ось оновлений запит, який використовується inner join:

select T.PRICE, S.ROW, S.NUMBER, M.TITLE
from [cinema_no_keys].[dbo].[TICKET] T
inner join [cinema_no_keys].[dbo].[SEAT] S on
T.ID_SEAT = S.ID_SEAT
inner join [cinema_no_keys].[dbo].[SHOW] SH on
SH.DATE_HOUR = T.DATE_HOUR
inner join [cinema_no_keys].[dbo].[MOVIE] M on
M.ID_MOVIE = SH.ID_MOVIE

Я змінив порядок приєднання: адже movie посилання на поле в show, show повинен прийшов раніше movie.