[MSSQL] Warning: Null value is eliminated... i co dalej?

0

Piszę tego posta, żeby się upewnić.
Podczas samego selecta jest wszystko ok.
Ae gdy robię insert z tego selecta dostaję warning:
"Null value is eliminated by an aggregate or other SET operation"

W tabeli, do której robię Insert dane pole pozwala na przyjęcie Null.

Mój select wygląda tak(nie próbujcie za bardzo rozkminiać):

select fi.ID, max(ev.date) as lastOut
from firstIns fi
left join endDates ed on ed.fiID = fi.ID
left join V_Events ev on ev.employeeID = fi.EmployeeID and
					dbo.get_date(ev.date) = dbo.get_date(ed.endDate)
group by fi.id
order by fi.ID

ev.date może być czasami nullem i podejrzewam, że to przez to dostaję ten komunikat(ale czymu tylko podczas insertu, a nie podczas samego selectu?).

Wiem, że mogę to ominąć na dwa sposoby, pierwszy:

zamiast max(ev.date) dać: max(isNull(ev.date, 0)). Jednak wtedy w tabeli nie mam żadnego nulla, tylko pierwszą datę, a to mi nieco komplikuje.

Drugim sposobem jest wyłączenie warningów i włączenie ich po insercie.
Skoro potrzebuję mieć te nulle w tabeli, to czy mogę bez obaw wyłączyć komunikaty na czas insertu? Czy może jest jeszcze inny, lepszy sposób?

0

Zauwaz, ze:

ev.employeeID = fi.EmployeeID

sprawia, ze z left joina robi sie inner join (czyli juz tutaj nie ma mozliwosci na nulla) i tak samo w przypadku:

dbo.get_date(ev.date) = dbo.get_date(ed.endDate)

bo fi z ev jest inner, wiec i tutaj bedzie inner. Nie dostaniesz wyniku 'laczenia' z nullowymi wierszami, bo wykluczasz nulle warunkiem rownosci.

0
Juhas napisał(a)

Podczas samego selecta jest wszystko ok.

W zakładce Messages powinien być ten komunikat.

Null value is eliminated by an aggregate or other SET operation

Taki komunikat otrzymujesz gdy jedna lub więcej z agregowanych w tym zapytaniu wartości jest NULL.

Jeżeli przynajmniej jedna z wartości agregowanych nie jest NULL to NULL-e nie będą w ogóle brane pod uwagę podczas agregowania. Jeżeli wszystkie agregowane wartości są NULL to wynikiem działania agregatu będzie NULL.

Co z tym zrobić?
Masz cztery wyjścia:

  1. max(isnull(ev.date,0))
  2. WHERE NOT ev.date IS NULL
  3. SET ANSI WARNINGS OFF
  4. olać to
johny_bravo napisał(a)

Nie dostaniesz wyniku 'laczenia' z nullowymi wierszami, bo wykluczasz nulle warunkiem rownosci.

Przeczytałem to 10 razy i nadal nie rozumiem o co Ci chodzi...

johny_bravo napisał(a)

sprawia, ze z left joina robi sie inner join

Jeżeli LEFT JOIN nie znajdzie rekordu o odpowiadającym id to do wyniku zapytania doklei z lewej strony NULL-e. Jeżeli INNER JOIN nie znajdzie rekordu o odpowiadającym id to nie zwróci w ogóle tej linijki.

0

AdamPL:

Laczysz sie left joinem po EmployeeID, ktore, jak mniemam, jest kluczem glownym. Zatem na pewno nie jest NULLem. A warunek brzmi: ev.employeeID = fi.EmployeeID. Czyli left join NIE zwroci wierszy z NULLem (choc normalnie by tak zrobil), bo nie beda pasowac do warunku.

Taki sam efekt otrzymasz np. w takim zapytaniu:

select * from a left join b on a.cos = b.cos where b.kol2 = 5

kol2 musi byc rowne konkretnej wartosci nie NULLowej, wiec wiersze z NULLami zostana odrzucone.

0
johny_bravo napisał(a)

Laczysz sie left joinem po EmployeeID, ktore, jak mniemam, jest kluczem glownym.

To są tylko Twoje domysły. Nie wiesz czy to jest klucz główny.

johny_bravo napisał(a)

Czyli left join NIE zwroci wierszy z NULLem (choc normalnie by tak zrobil), bo nie beda pasowac do warunku.

Jeżeli na ID jest klucz to warunek nic tu nie zmienia pod tym względem i nie odfiltrowuje NULL-owych wierszy. Nie widzisz NULL-owych bo takich po prostu nie ma w ogóle w bazie jeżeli jest klucz.

SELECT * FROM a LEFT JOIN b ON a.cos = b.cos WHERE b.kol2 = 5

Jeżeli na polu cos nie ma klucza to zapytanie nie zwróci NULL tylko dlatego, że jest warunek na kol2. Juhas nie ma WHERE więc jeżeli ID nie jest kluczem to zwróci NULL-owe wiersze.

Poza tym gdyby nawet Juhas miał klucz główny na ID to nie zmienia to faktu, że agregat ma na Date, które już sobie może być NULL bo Pani Ziuta zapomniała uzupełnić. Komunikat "Null value is eliminated by an aggregate or other SET operation" informuje, że w polu Date na pewno są NULL-e.

0

No Adam ma zupełną rację. Mam tam dokładnie 19 nulli :P
Czyli mówicie, że po prostu wyłączyć komunikaty na czas tego insertu, tak?
(potrzebuję tych nulli)

0
Juhas napisał(a)

Czyli mówicie, że po prostu wyłączyć komunikaty na czas tego insertu, tak?

Nic innego nie można w tym przypadku zrobić.

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