Jakie złączenie kiedy w jednej z tabeli nie ma odpowiednika?

Jakie złączenie kiedy w jednej z tabeli nie ma odpowiednika?
S3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

OK, konkrety. Są dwie tabele, załóżmy Sprzedaz i Koszty:

Sprzedaz:

Kopiuj
+---------------+-----------+-----------+------------+
| Numer 		| Tytuł		| Cena		| Data		 |
+---------------+-----------+-----------+------------+
| 9405753489	| LODÓWKA  	|  36,67	| 2020-06-22 |
| 9405753489	| LODÓWKA  	| -30,39	| 2020-06-21 |
| 9405753489	| LODÓWKA  	| -30,39	| 2020-06-20 |
| 9405753489	| LODÓWKA  	| -30,39	| 2020-06-19 |
+---------------+-----------+-----------+------------+

Koszty:

Kopiuj
+---------------+-------+------------+
| Numer			| Koszt	| Data		 |
+---------------+-------+------------+
| 9405753489	| 43,77	| 2020-06-23 |
| 9405753489	| 16,24	| 2020-06-22 |
| 9405753489	| 62,28	| 2020-06-21 |
| 9405753489	| 38,05	| 2020-06-20 |
| 9405753489	| 14,85	| 2020-06-19 |
+---------------+-------+------------+

Jak widzicie, w tabeli Koszty znajduje się wiersz z datą 23 czerwca której nie ma w tabeli Sprzedaz. Próbuję uzyskać tabelę będącą wynikiem złączenia tych dwóch tabel w którym sytuacja taka jak powyżej spowoduje wstawienie wiersza z datą 23 czerwca i z nullem w miejscu gdzie nie ma danych, czyli wynik powinien wyglądać tak:

Kopiuj
+---------------+-----------+-----------+-------+------------+
| Numer 		| Tytuł		| Cena		| Koszt	| Data		 |
+---------------+-----------+-----------+-------+------------+
| 9405753489	| NULL		| NULL		| 43,77 | 2020-06-23 |
| 9405753489	| LODÓWKA  	|  36,67	| 16,24	| 2020-06-22 |
| 9405753489	| LODÓWKA  	| -30,39	| 62,28	| 2020-06-21 |
| 9405753489	| LODÓWKA  	| -30,39	| 38,05	| 2020-06-20 |
| 9405753489	| LODÓWKA  	| -30,39	| 14,85	| 2020-06-19 |
+---------------+-----------+-----------+-------+------------+

Wydaje się proste, ale poległem.Złączam tabele po polach Numer i Data, czyli:

Kopiuj
SELECT * FROM sprzedaz S
LEFT JOIN koszt K ON S.Numer = K.Numer AND (S.Data = K.Data OR K.Data IS NULL)```

Ale wynikiem jest tabela bez wiersza z 23 czerwca.

Niby banał, a nie mogę ogarnąć :/

KamilAdam
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Silesia/Marki
  • Postów: 5680
0

A próbowałeś na odwrót? Albo napisać rzadko spotykany RIGHT JOIN, albo żeby to Koszty były tabelą nadrzędną?

biela_
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: KRK
  • Postów: 138
4

title

abrakadaber
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 6610
3

przy left join po "lewej" stronie musisz mieć tabelę z większą ilością rekordów

S3
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 25
0

Mam wrażenie że problem tkwi w warunku S.Data = K.Data OR K.Data IS NULL. Z drugiej strony bez warunku z datami tabela wynikowa łączy rekordy na zasadzie "każdy z każdym", i słusznie, bo warunek S.Numer = K.Numer jest spełniony.

Oczywiście próbowałem LEFT JOIN z "większą" tabelą po lewej. Wciąż brak wpisu z 23.06.

PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3902
2

bo niepotrzebny jest ten warunek na null w sprzężeniu, wystarczy:

Kopiuj
SELECT k.numer, s.tytul,s.cena,k.koszt,k.data FROM koszty K 
LEFT JOIN sprzedaz S ON S.Numer = K.Numer AND S.Data = K.Data 

http://sqlfiddle.com/#!9/a1fa6e/3

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
1

Potrzebujesz FULL OUTER JOIN:

Kopiuj
SELECT *
FROM koszty K 
FULL OUTER JOIN sprzedaz S
  ON S.Numer = K.Numer
  AND S.Data = K.Data 

http://sqlfiddle.com/#!17/fb5358/3

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.