Чи потрібні SQL підзапити?
Уявіть достатньо узагальнену реалізацію структурованої мови запитів для баз даних відношень. Оскільки структура канонічного оператора SQL SELECT
насправді є досить важливою для цього, щоб мати сенс, я не звертаюсь безпосередньо до реляційної алгебри, але ви могли це обрамлити в цих термінах, зробивши відповідні обмеження форми виразів.
SQL - SELECT
запит , як правило , складається з виступу ( SELECT
частина) деякої кількості JOIN
операцій (далі JOIN
частина), деяка кількість SELECTION
операцій (в SQL, в WHERE
пунктах), а потім встановити-навхрест операції ( UNION
, EXCEPT
, INTERSECT
і т.д.), за яким слідує інший SQL- SELECT
запит.
Об'єднані таблиці можуть бути обчисленими результатами виразів; Іншими словами, ми можемо мати таке твердження, як:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN (SELECT id, address
FROM table2 AS t3
WHERE t3.id = t1.id) AS t2
WHERE t1.salary > 50,000;
Ми будемо посилатися на використання обчисленої таблиці як частини SQL-запиту як підзапиту. У наведеному вище прикладі другий (з відступом) SELECT
- це запит.
Чи всі запити SQL можуть бути записані таким чином, щоб не використовувати підзапити? Наведений вище приклад може:
SELECT t1.name, t2.address
FROM table1 AS t1
JOIN table2 AS t2
ON t1.id = t2.id
WHERE t1.salary > 50,000;
Цей приклад є дещо хибним або тривіальним, але можна уявити випадки, коли для відновлення еквівалентного вираження може знадобитися значно більше зусиль. Іншими словами, чи буває так, що для кожного запиту SQL з підзапитами існує запит q ' без підзапитів, таким, що q і q ' гарантовано дають однакові результати для одних і тих же базових таблиць? Обмежимо запити SQL у такій формі:
SELECT <attribute>,
...,
<attribute>
FROM <a table, not a subquery>
JOIN <a table, not a subquery>
...
JOIN <a table, not a subquery>
WHERE <condition>
AND <condition>
...
AND <condition>
UNION
-or-
EXCEPT
-or-
<similar>
SELECT ...
І так далі. Я думаю, що лівий і правий зовнішні з'єднання не дуже додають, але якщо я помиляюся, будь ласка, не соромтесь зазначити це ... у будь-якому випадку, вони також є чесною грою. Що стосується заданих операцій, я думаю, що будь-яка з них нормальна ... з'єднання, різниця, симетрична різниця, перетин тощо ... все, що є корисним. Чи є відомі форми, до яких можна зменшити всі запити SQL? Чи усуває будь-який із цих запитів? Або є випадки, коли не існує еквівалентного запиту без підзапитів? Посилання вдячні ... або демонстрація (на підтвердження) того, що вони є або не потрібні, була б фантастичною. Дякую і вибачте, якщо це видатний (або тривіальний) результат, який я болісно не знаю.
select count(*) from (select id from sometable group by id having count(*)>1) d
. Оскільки це включає, group by
я не ставлю це як відповідь.
ON
застереження необхідне для JOIN
s, хоча перехресний добуток виходить лише з комою.