Złączenie dwóch tabel

Złączenie dwóch tabel
  • Rejestracja: dni
  • Ostatnio: dni
0

Mam takie dwie tabele:

Kopiuj
stawka
   0
   7
   10
   22	
Kopiuj
Osoba   | Stawka | Suma
--------+--------+-------
Osoba1  |   0    |  123
Osoba1  |   22   |  345

Jak połączyć te dwie tabele aby uzyskać taki efekt ?

Kopiuj
Osoba   | Stawka | Suma
--------+--------+-------
Osoba1  |   0    |  123
Osoba1  |   22   |  345
Osoba1  |   7    |  0
Osoba1  |   10   |  0

Czyli te wiersz w których stawka się zgadza, mają byc normalnie wyświetlone, a te stawki których w drugie tabeli nie ma, dodały się ?
Każda osoba ma być wyświetlona tyle razy, ile jest stawek w pierwszej tabeli.

  • Rejestracja: dni
  • Ostatnio: dni
0

Rozwiązanie sprawdzone na SQL Server 2005:

Kopiuj
select tmp.Osoba, tmp.Stawka, IsNull(o.Suma, 0) as Suma
from
  Osoby o
right join
  (select o.Osoba, s.Stawka
   from (select distinct Osoba from Osoby) o
   cross join Stawki s) tmp 
on o.Osoba = tmp.Osoba and o.Stawka = tmp.Stawka
order by tmp.Osoba, tmp.Stawka
Misiekd
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7923
0
Kopiuj
select o.osoba, s.stawka, o.suma from stawki s
left join osoba o on s.stawka = o.stawka;

z tym, że w o.suma musisz zamienić null na 0 a jak to już od bazy zależy - isnull w MSSQL nvl w oraclu

__Marcin__
  • Rejestracja: dni
  • Ostatnio: dni
0
Misiekd napisał(a)
Kopiuj
select o.osoba, s.stawka, o.suma from stawki s
left join osoba o on s.stawka = o.stawka;

z tym, że w o.suma musisz zamienić null na 0 a jak to już od bazy zależy - isnull w MSSQL nvl w oraclu

Niestety Twoje rozwiązanie nie da oczekiwanych wyników. Nie uzyskasz w ten sposób rekordów:
Osoba 1, stwaka 7, suma 0
Osoba 1, stawka 10, suma 0

Misiekd
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 7923
0

sprawdziłeś, czy się domyślasz?

__Marcin__
  • Rejestracja: dni
  • Ostatnio: dni
0
Misiekd napisał(a)

sprawdziłeś, czy się domyślasz?

Nie muszę sprawdzać działania tak prostych mechanizmów jak LEFT JOIN żeby wiedzieć jaki będzie wynik.
Ale dla Ciebie poświęciłem te kilka minut i oto resultat:

Twoje zapytanie generuje następujące wyniki (już po użyciu IsNull dla kolumny suma):

Kopiuj
Osoba   | Stawka | Suma
--------+--------+-------
NULL    |   7    |  0
NULL    |   10   |  0
Osoba1  |   0    |  123
Osoba1  |   22   |  345

Moje zapytanie z pierwszego postu (z użyciem cross join) daje:

Kopiuj
Osoba   | Stawka | Suma
--------+--------+-------
Osoba1  |   0    |  123
Osoba1  |   7    |  0
Osoba1  |   10   |  0
Osoba1  |   22   |  345

, a więc to czego oczekiwał autor.

Różnica jest chyba wyraźna.

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.