КРОМЕ запроса в SQL

#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 на более высоком уровне приоритета.