He creado algunas consultas y no puedo entender por qué los resultados no son los que esperaba.Usando predicados NOT en SQL
No entiendo por qué Query II y III no devuelven los mismos resultados. Esperaría que la consulta II devuelva todas las filas no seleccionadas por Query I.
Hubiera esperado que Query II y III dieran los mismos resultados. En mi opinión, los resultados de III son los correctos.
Estoy seguro de que extraño algo, simplemente no sé qué.
El ejemplo:
Tabla:
CREATE TABLE [dbo].[TestTable](
[TestTableId] [int] NOT NULL,
[ValueA] [int] NULL,
[ValueB] [int] NULL
) ON [PRIMARY]
datos:
TestTableId ValueA ValueB
1 10 5
2 20 5
3 10 NULL
4 20 NULL
5 NULL 10
6 10 10
7 NULL NULL
Consultas:
Todos los registros: seleccionar * de TestTable
I. Una consulta de selección:
select * from TestTable
where (ValueA = 10 or ValueA = 20) AND ValueB = 5
Resultado:
TestTableId ValueA ValueB
1 10 5
2 20 5
II. La misma consulta pero como NOT
select * from TestTable
where NOT ((ValueA = 10 or ValueA = 20) AND ValueB = 5)
Resultado:
TestTableId ValueA ValueB
5 NULL 10
6 10 NULL
III. La misma consulta que la segunda (yo creo)
select * from TestTable where TestTable.TestTableId not in
(select TestTableId from TestTable
where (ValueA = 10 or ValueA = 20) AND ValueB = 5)
Resultado:
TestTableId ValueA ValueB
3 10 NULL
4 20 NULL
5 NULL 10
6 10 10
7 NULL NULL
'NULL = 5' se evalúa como' UNKNOWN' (en lugar de "no"). – onedaywhen
Estaba siendo un poco metafórico. El punto es que una fila donde ValueB es NULL se excluirá de ambos. – BradC
@onedaywhen - Edité mi publicación para ser un poco más preciso en función de su comentario. – BradC