У мене є завдання написати запит, який використовує єдине внутрішнє приєднання і перехресне з'єднання. Запит, який я вже написав, має повертати той самий результат, виглядає так:
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 за відповідь № 1cross 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
.