Zapytanie przestało działać

Zapytanie przestało działać
BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
0

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

Kopiuj
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:

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

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5654
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

jurek1980
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3622
4

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

axelbest
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Warszawa
  • Postów: 2255
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....

BU
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 297
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.

YA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2396
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);

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3900
3

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

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

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

Kopiuj
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:

Kopiuj
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:

Kopiuj
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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.