INTERSECT имеет более высокий приоритет по сравнению с UNION? - PullRequest
6 голосов
/ 20 мая 2019

Если мы рассмотрим три таблицы с одним столбцом, каждая из которых имеет две строки: A = (1, 2), B = (2, 3), C = (3, 4).Тогда, если мы попробуем UNION и INTERSECT вместе, используя круглые скобки, результат будет вполне согласованным:

  • (select * from a union select * from b) intersect select * from c -> 3
  • select * from a union (select * from b intersect select * from c) -> 1, 2, 3

А как насчет простого и простого ...

  • select * from a union select * from b intersect select * from c?

Я пробовал на нескольких базах данных( SQL Fiddle ) и то, что я получил эмпирически, это:

  • В одном углу у нас есть Oracle, PostgreSQL и H2, которые рассматривают INTERSECT с таким же приоритетом как UNION (следовательно, результат равен 3).
  • Затем в другом углу находятся DB2, SQL Server, MariaDB, Apache Derby и HyperSQL, которые рассматривают INTERSECT с более высоким приоритетом , чем UNION(следовательно, результат равен 1, 2, 3).
  • MySQL и Sybase ASE остаются вне кольца, поскольку они вообще не реализуют INTERSECT.

Ребята, ребята?знаете, есть ли официальное определение по этому поводу?Я просмотрел спецификацию SQL-92, но ничего не смог найти по этому вопросу.

1 Ответ

4 голосов
/ 20 мая 2019

Oracle имеет эту пояснительную записку в своей документации :

Чтобы соответствовать появляющимся стандартам SQL, в следующем выпуске Oracle оператор INTERSECT будет иметь больший приоритет, чем другие операторы множеств. Следовательно, вы должны использовать круглые скобки для указания порядка вычисления в запросах, которые используют оператор INTERSECT с другими операторами множеств.

Итак, Oracle, по крайней мере, считает, что равный приоритет не соответствует стандарту.

Как примечание: я часто нахожу стандарт настолько непостижимым, что подобные подсказки проще, чем пытаться расшифровать фактический текст.

...