Jak działa operator != gdy jedno z pól to jest NULL

0

Witam,

Mam tabelę TOWARY:

 
ID_TOWARU	NAZWA_TOWARU
1	Tynk akrylowy
2	Kombinerki
3	Horalky
4	Termowentylator
5	Drzwi

i tabelę FAKT_SPRZEDAZY_POZ:

ALT_KEY_FAK	ID_TOWARU
56C7ADE4-0693-43B7-9072-B0D35BF42E6C	4
B82E738B-CEC4-4D3A-8587-9E78CF89C013	5 

Zapytanie:

SELECT fsp.ID_TOWARU, t.ID_TOWARU, t.NAZWA_TOWARU FROM FAKT_SPRZEDAZY_POZ fsp right join TOWARY t on fsp.ID_TOWARU = t.ID_TOWARU 

Daje wynik

 ID_TOWARU	ID_TOWARU	NAZWA_TOWARU
NULL	1	Tynk akrylowy
NULL	2	Kombinerki
NULL	3	Horalky
4	4	Termowentylator
5	5	Drzwi

Natomiast zapytanie:

SELECT fsp.ID_TOWARU, t.ID_TOWARU, t.NAZWA_TOWARU FROM FAKT_SPRZEDAZY_POZ fsp right join TOWARY t on fsp.ID_TOWARU = t.ID_TOWARU where fsp.ID_TOWARU != t.ID_TOWARU 

nie zwraca żadnej wartości, a chciałbym żeby zwróciło:

 ID_TOWARU	ID_TOWARU	NAZWA_TOWARU
NULL	1	Tynk akrylowy
NULL	2	Kombinerki
NULL	3	Horalky

Gdzie robię błąd w myśleniu?

0

może zacznij od tego co to za baza i co tak naprawdę robi operator != (DOKUMENTACJA)

0

Skoro łączysz po tym polach, to nie ma szans, aby były one !=. Jedyny mozliwy scenariusz gdy jedno z tych pól jest NULL. Ale wtedy musisz użyć IS NULL...

0

MSSQL 2K5

!= (Not Equal To)

Tests whether one expression is not equal to another expression (a comparison operator). Functions the same as the Not Equal To (<>) comparison operator.

<> (Not Equal To)

Compares two expressions (a comparison operator). When you compare nonnull expressions, the result is TRUE if the left operand is not equal to the right operand; otherwise, the result is FALSE. If either or both operands are NULL and SET ANSI_NULLS is set to ON, the result is NULL. If SET ANSI_NULLS is set to OFF, the result is FALSE if one of the operands is NULL, and TRUE if both operands are NULL.

Źródło: MSDN

Czyli mając NULLa z lewej czy też z prawej strony operatora jako wynik otrzymam NULL jeśli SET ANSI_NULLS jest ON, bądź też FALSE jeśli SET ANSI_NULLS jest OFF.
... jaki operator zatem da mi wynik TRUE?
Albo jak inaczej rozwiązać ten problem?

Marcin.Miga napisał(a)

Skoro łączysz po tym polach, to nie ma szans, aby były one !=. Jedyny mozliwy scenariusz gdy jedno z tych pól jest NULL. Ale wtedy musisz użyć IS NULL...

No właśnie w tym sęk, że nie wiem jakie zapytanie napisać, aby zwrócić to co chciałem uzyskać w pierwszym poście.

0

where fsp.ID_TOWARU is null

0

Dzięki, działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1