Zaprzeczenie warunków.

0

Witam.

Mam takie tabelki:

Name Type
p_id int
p_typ int
p_typ_kh int
p_nazwa nvarchar (100)
p_DataOD datetime
p_DataDO datetime
p_okres bit
Name Type Comment
p_kh_id_promo int ⇨ Promocje.p_id
p_kh_id_kh int

Zapytanie 1

SELECT * FROM  PROMOCJE
LEFT JOIN PROMOCJEKH ON P_ID = P_KH_ID_PROMO
WHERE  P_TYP_KH = 1 

Daje 42 rekordy.

Zapytanie 2

SELECT * FROM  PROMOCJE
LEFT JOIN PROMOCJEKH ON P_ID = P_KH_ID_PROMO
WHERE  P_TYP_KH = 1 AND P_KH_ID_KH <> 905

Daje 39 rekordów.

Zapytanie 3

SELECT * FROM  PROMOCJE
LEFT JOIN PROMOCJEKH ON P_ID = P_KH_ID_PROMO
WHERE  P_TYP_KH = 1 AND P_KH_ID_KH = 905

Daje 1 rekord - dlaczego ? Czy suma warunków = i <> nie powinna dać tego co w punkcie 1 ?

Z góry dziękuję za wyjaśnienie.

0

Nie. NULL

0

Właśnie widzie że ten NULL coś miesza...
A warunek < > X nie powinien zwrócić wartości z NULL ? (jak by nie było nie są równe X)


czyli powinno być coś takiego :

SELECT * FROM  PROMOCJE
LEFT JOIN PROMOCJEKH ON P_ID = P_KH_ID_PROMO
WHERE  P_TYP_KH = 1 AND (P_KH_ID_KH <> 905 OR p_kh_id_kh IS NULL)

?

1

Przez NULL.

  1. LEFT JOIN oznacza, że w wynikach mogą pojawić się PROMOCJE, bez odpowiadających im PROMOCJEKH.
  2. NULL nie jest specjalnym rodzajem int'a, czy varchar'a - w ogóle nie jest wartością, tylko stanem pola. Każde pole zawsze jest NULL, albo NOT NULL.
    Porównania(=, <, >, <>) z polem pustym(NULL) zawsze zwracają wartość false.

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