UNION SELECT i LEFT JOIN - brak rekordów bez odpowiedników

0

Witam.

Mam takie zapytanie:

SELECT * FROM 
(SELECT '1' [lp], '18520' [id] 
UNION SELECT '2', '18521' 
UNION SELECT '3', '22584' 
UNION SELECT '4', '22585' 
UNION SELECT '5', '22893' 
UNION SELECT '6', '22898' 
UNION SELECT '7', '26482' 
UNION SELECT '8', '26484') x
LEFT OUTER  JOIN extratable ON extratable.ex_id = x.id

W tabeli extratable są wiersze z ex_id od 3 do 6.

Dlaczego (mimo użycia LEFT OUTER JOIN) w wyniku otrzymuje rekordy z id od 3 do 6?

Czy nie powinno również zwrócić wierszy z id 1,2,7,8 z pustymi kolumnami z tabeli extratable?

0

Powinieneś dostać wszystkie rokordy z podzapytania x i pasujące do nich rekordy z tabeli extratable.
Zakładając że ex_id ma wartości 3,4,5,6 to nie powinno być żadnych dopasowań, ponieważ żaden rekord w podzapytaniu x nie ma takich wartości w kolumnie id...

0
Panczo napisał(a):

Powinieneś dostać wszystkie rokordy z podzapytania x i pasujące do nich rekordy z tabeli extratable.

Takiego efektu się spodziewałem, a dostaje coś takiego:

lp id me_id kat person
3 22584 708222 1 1293
4 22585 708531 1 32
5 22893 708524 1 967
6 22898 708181 1 993

i właśnie nie bardzo rozumiem dlaczego...

0

Nie mam szklanej kuli więc nie wiem dlaczego dostajesz takie wyniki, bo to co wkleiłeś jako źródło nie jest na pewno wynikiem zapytania z pierwszego postu...

0

Zapytanie wygląda dokładnie tak:

SELECT x.lp, x.twid, Ilosc FROM 
(SELECT '1' [lp], '18520' [twid] 
UNION SELECT '2', '18521' 
UNION SELECT '3', '22584' 
UNION SELECT '4', '22585' 
UNION SELECT '5', '22893' 
UNION SELECT '6', '22898' 
UNION SELECT '7', '26482' 
UNION SELECT '8', '26484') x
LEFT OUTER  JOIN SprKh ON SprKh.TowId = x.twid
WHERE  DataWyst = '2015-11-18'
ORDER BY x.lp

SprKh - to widok oferowany przez producenta.

Wynik jaki otrzymuje:

lp twid Ilosc
3 22584 5,00
3 22584 10,00
3 22584 0,00
4 22585 5,00
4 22585 0,00
4 22585 0,00
5 22893 18,00
5 22893 0,00
5 22893 0,00
5 22893 0,00
6 22898 6,00
6 22898 0,00
7 26482 12,00
1

No tutaj to Ci

where 

ogranicza. Dla rekordow z lewej strony joina DataWyst jest null a wiec <> '2015-11-18' wiec nie znajdują się w recordsecie.

0

@Ldr dzięki - niby oczywiste a się zakręciłem :).

Przeniosłem warunek do JOIN'a i śmiga :)

0

LEFT OUTER JOIN SprKh ON SprKh.TowId = x.twid and DataWyst = '2015-11-18'

EDIT: porównywanie pola typu data z ciągiem znakowym kiedyś się na tobie zemści - wystarczy, że z jakichś powodów (np. aktualizacja systemu) zmieni się domyślny format daty i wszystkie zapytania się wyłożą

0

@abrakadaber w ten właśnie sposób przerobiłem zapytanie (przeniosłem warunek do JOIN'a).

A w jaki sposób powinienem poprawnie wstawić datę do zapytania?

0

wiem, ale zobaczyłem dopiero jak dodałem post.

Co do podawania daty to jeśli podajesz ją w programie to powinieneś użyć parametru i przekazać z programu datę, resztę za Ciebie zrobi soft. Jeśli podajesz ją wprost do zapytania (np. w jakimś edytorze SQLowym albo jest to stała data) to powinieneś użyć funkcji konwertującej ze stringa na datę, która jako jeden z parametrów przyjmuje format w jakim jest data podana. Dla MSSQLa będzie to np. CONVERT i jakieś przykłady

0

Dziękuję bardzo za wyjaśnienie. Przyjrzę się temu i poprawie :).

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