#sql #database #db2
#sql #База данных #db2
Вопрос:
Я выполняю запрос except в SQL следующим образом
Q1, КРОМЕ Q2, КРОМЕ Q3
Где Q1, Q2 и Q3 являются вложенными запросами. Я просто хочу знать, каким будет его вывод, (Q1-Q2) -Q3 или Q1- (Q2-Q3)? и если 2-й, как получить 1-й в качестве вывода?
Комментарии:
1. Это было бы намного проще с реальным кодом.
2. Заключите их в квадратные скобки, как вы предлагаете в своем вопросе.
3. Как мы должны знать, каким будет результат?
4. sscce пожалуйста
5. Каждый Q1, Q2 и Q3 является подзапросом формы SELECT … От… ГДЕ … .
Ответ №1:
У меня нет установки DB2, но в PostgreSQL, Q1 except Q2 except Q3
похоже, интерполируется как (Q1 except Q2) except Q3
(примечание: generate_series(m,n)
это функция, найденная в PostgreSQL, которая генерирует один столбец целочисленных значений от m
до n
(где m<n
, конечно)):
select generate_series(1,10) except select generate_series(5,15) except select generate_series(10,20);
generate_series
-----------------
1
2
3
4
(4 rows)
select * from (select generate_series(1,10) except select generate_series(5,15))a except select generate_series(10,20);
generate_series
-----------------
1
2
3
4
(4 rows)
select generate_series(1,10) except select * from (select generate_series(5,15) except select generate_series(10,20))a;
generate_series
-----------------
1
2
3
4
10
(5 rows)
Однако лучше всего использовать круглые скобки, чтобы убедиться, что порядок вычисления соответствует вашему желанию.
Комментарии:
1. Я проголосовал против из-за предложения для скобок для ясности. Полностью согласен. В любое время вам нужно остановиться и подумать без них, это плохо.
Ответ №2:
Стандарт SQL-92 подтверждает (приложение C) то, что должно быть довольно интуитивно понятным: при отсутствии круглых скобок оба вхождения EXCEPT
в примере кода будут (очевидно) иметь одинаковый уровень приоритета, и в этом случае они должны оцениваться в порядке слева направо.
Из интереса, приоритет EXCEPT
, INTERSECT
и UNION
(скобки в сторону) зависит от реализации, поэтому обратитесь к документации продукта SQL. Однако быстрый поиск в Google, похоже, предполагает, что большинство продуктов SQL (включая DB2) имеют EXCEPT
и UNION
на том же уровне приоритета, и INTERSECT
на более высоком уровне приоритета.