Если мы рассмотрим три таблицы с одним столбцом, каждая из которых имеет две строки: 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, но ничего не смог найти по этому вопросу.