Zapytanie przestało działać

0

Witajcie,
Czy jakaś mądra głowa, może mi powiedzieć, czemu takie zapytanie

SELECT * FROM tabela WHERE pole IN (NULL, SELECT id FROM tab WHERE p = 2)

Założenie było takie, że mam wybrać dane z tabeli 'tabela' , gdzie w polu 'pole' jest NULL lub jakaś z wartości wybranych podzapytaniem.
Wcześniej działało, i nagle przestało. Musiałem je przerobić do postaci:

SELECT * FROM tabela WHERE (pole IS NULL OR pole IN (SELECT id FROM tab WHERE p = 2))

4

NULL to specjalna wartość i nie oznacza tego co null w programowaniu, bo na NULL w bazach danych jest zaimplementowana Logika trójwartościowa. W zasadzie lepszą nazwą dla NULL w bazach danych byłoby UNKNOWN

4

To pierwsze zapytanie, jeśli działało to mogło nie dawać poprawnego wyniku. To drugie poza niepotrzebnym nawiasem wygląda ok.

3

Twoje podzapytanie SELECT id FROM tab WHERE p = 2 pewnie wcześniej zwracało Ci jeden wynik, a popsuło się gdy zaczęło zwracać dwa

W uproszczeniu główne zapytanie wygląda tak
SELECT * FROM tabela WHERE pole IN (JAKIS_ZBIÓR)

A to
SELECT id FROM tab WHERE p = 2=> zwracało JAKIŚ_ZBIÓR

Zatem miałeś coś takiego
SELECT * FROM tabela WHERE pole IN (NULL, JAKIS_ZBIÓR)
Jak już pisałem - działało to dobrze, gdy w w jakimś zbiorze był jeden element, ale to że działało to raczej szczęście.
Czyli jak widać
SELECT * FROM tabela WHERE pole IN (NULL, JAKIS_ZBIÓR) nie jest równe
SELECT * FROM tabela WHERE pole IN (JAKIS_ZBIÓR)

Mam nadzieję, ze opisałem to zrozumiale....

0
axelbest napisał(a):

Twoje podzapytanie SELECT id FROM tab WHERE p = 2 pewnie wcześniej zwracało Ci jeden wynik, a popsuło się gdy zaczęło zwracać dwa

W uproszczeniu główne zapytanie wygląda tak
SELECT * FROM tabela WHERE pole IN (JAKIS_ZBIÓR)

A to
SELECT id FROM tab WHERE p = 2=> zwracało JAKIŚ_ZBIÓR

Zatem miałeś coś takiego
SELECT * FROM tabela WHERE pole IN (NULL, JAKIS_ZBIÓR)
Jak już pisałem - działało to dobrze, gdy w w jakimś zbiorze był jeden element, ale to że działało to raczej szczęście.
Czyli jak widać
SELECT * FROM tabela WHERE pole IN (NULL, JAKIS_ZBIÓR) nie jest równe
SELECT * FROM tabela WHERE pole IN (JAKIS_ZBIÓR)

Mam nadzieję, ze opisałem to zrozumiale....

Może i racja. Hmmm. No nic. Ważne, że naprawione. Zapytałem w zasadzie tak z ciekawości. A dokładnie chodziło o to, że był budowany filtr SQL w ERP Optima. I ten filtr miał właśnie zapis jak w pierwszym zapytaniu, czyli (NULL, SELECT....). I działało. I nagle przestało działać, a Optima zwracała błąd, że filtr niezgodny ze składnią SQL.

1

Kiedyś działało i nagle przestało, tzn. że coś się zmieniło, np. dane ;-)

Twoje zapytanie prawdopodobnie od początku nie działało poprawnie:
SELECT * FROM tabela WHERE pole IN (NULL, SELECT id FROM tab WHERE p = 2)

Kiedyś mogłeś mieć w tabela:

pole
Null
3

Wystarczyło, że SELECT id FROM tab WHERE p = 2 zwróciło 3 i dostawałeś warunek pole in (NULL, 3), co przekładało się na 1 zwrócony wiersz, więc mogłeś uznać, że "zapytanie działa".

Zobacz co zwróci Ci zapytanie:
SELECT * FROM tabela WHERE NULL IN (NULL);

3

Teoretycznie nie powinno to zadziałać bo takie zapytanie:

SELECT * FROM tabela WHERE pole IN (NULL, SELECT id FROM tab WHERE p = 2)

Ma nieprawidłową składnie i zwróci błąd:

Msg 156, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'SELECT'.
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near ')'.

Poprawnie by było tak:

SELECT * FROM tabela WHERE pole IN (NULL, (SELECT id FROM tab WHERE p = 2))

Jeżeli to podzapytanie zwraca jeden rekord, bo inaczej dostniesz błąd:

Msg 512, Level 16, State 1, Line 3
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.

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