Использование предикатов NOT в SQL

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

Я не понимаю, почему запросы II и III не выполняются. t вернуть те же результаты. Я ожидал, что запрос II вернет все строки, не выбранные запросом I.

Я ожидал, что запросы II и III дадут одинаковые результаты. На мой взгляд, результаты III являются правильными.

Я уверен, что что-то упускаю, просто не знаю что.

Пример:

Таблица:

CREATE TABLE [dbo].[TestTable](
 [TestTableId] [int] NOT NULL,
    [ValueA] [int] NULL,
 [ValueB] [int] NULL
) ON [PRIMARY]

Данные:

TestTableId ValueA ValueB
1        10      5
2        20      5
3        10      NULL
4        20        NULL
5        NULL      10
6        10        10
7        NULL      NULL

Запросы:

Все записи:

Я ожидал, что запросы II и III дадут одинаковые результаты. На мой взгляд, результаты III являются правильными.

Я уверен, что что-то упускаю, просто не знаю что.

Пример:

Таблица:

CREATE TABLE [dbo].[TestTable](
 [TestTableId] [int] NOT NULL,
    [ValueA] [int] NULL,
 [ValueB] [int] NULL
) ON [PRIMARY]

Данные:

TestTableId ValueA ValueB
1        10      5
2        20      5
3        10      NULL
4        20        NULL
5        NULL      10
6        10        10
7        NULL      NULL

Запросы:

Все записи:

Я ожидал, что запросы II и III дадут одинаковые результаты. На мой взгляд, результаты III являются правильными.

Я уверен, что что-то упускаю, просто не знаю что.

Пример:

Таблица:

CREATE TABLE [dbo].[TestTable](
 [TestTableId] [int] NOT NULL,
    [ValueA] [int] NULL,
 [ValueB] [int] NULL
) ON [PRIMARY]

Данные:

TestTableId ValueA ValueB
1        10      5
2        20      5
3        10      NULL
4        20        NULL
5        NULL      10
6        10        10
7        NULL      NULL

Запросы:

Все записи: выберите * из TestTable

I. Запрос на выбор:

select * from TestTable 
where (ValueA = 10 or ValueA = 20) AND ValueB = 5

Результат:

TestTableId ValueA ValueB
1           10   5
2           20   5

II. Тот же запрос, но НЕ

select * from TestTable 
where NOT ((ValueA = 10 or ValueA = 20) AND ValueB = 5)

Результат:

TestTableId ValueA ValueB
5           NULL   10
6           10   NULL

III. Тот же запрос, что и второй (я думаю)

select * from TestTable where TestTable.TestTableId not in 
    (select TestTableId from TestTable 
where (ValueA = 10 or ValueA = 20) AND ValueB = 5)

Результат:

TestTableId ValueA ValueB
3           10   NULL
4           20   NULL
5           NULL   10
6           10   10
7           NULL   NULL
5
задан Justin Niessner 18 November 2010 в 14:02
поделиться