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

0

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

Sprzedaz:

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

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

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

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ąć :/

0

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

4

title

3

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

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.

2

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

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

1

Potrzebujesz FULL OUTER JOIN:

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

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