SQL-союз ВСЕ и кроме

Я вижу странное поведение, когда я делаю операторы кроме и в SQL.

У меня две таблицы

Select * from #old

Данные выглядят так

oid1    oid2    co
   1      11     1
   2      22     1
   3      33     1
   4      55     1

Select * from #new

nid1    nid2    co
   1      11     3
   2      22     1
   3      33     1
   4      44     1
   4      55     1

Это мой последний запрос

Select * from #old
    except
    Select * from #new
    union all
    Select * from #new
    except
    Select * from #old

и дает эти записи

oid1    oid2    co
   1      11     3
   4      44     1

Вопрос, который у меня есть... Разве в этой строке не должно быть еще одной строки, кроме предложения:

Select * from #old
except
Select * from #new

который

oid1    oid2    co    
   1      11     1

Если в конечном запросе не 3 строки, а только 2, то не все столбцы одинаковы.

1 ответ

Вы, кажется, думаете, что запрос интерпретируется как:

(Select * from #old
 except
 Select * from #new
)
union all
(Select * from #new
 except
 Select * from #old
)

Но нет. Это интерпретируется как:

((Select * from #old
  except
  Select * from #new
 )
 union all
 Select * from #new
)
except
Select * from #old

Это эквивалентно:

Select * from #new
except
Select * from #old

это то, что возвращает ваш запрос.

Это объясняется в документации:

Если EXCEPT или INTERSECT используются вместе с другими операторами в выражении, оно оценивается в контексте следующего приоритета:

  1. Выражения в скобках

  2. ИНТЕРСЕКТ оператор

  3. EXCEPT и UNION оцениваются слева направо на основе их положения в выражении

Другие вопросы по тегам