Jak powinno wyglądać zapytanie, aby w wyniku otrzymać wszystkie towary wraz ze stanem (ilość) przy warunku WHERE Magazyny.IdMagazunu = 1?
Diagram tabel:
- Clipboard01.gif (10 KB) - ściągnięć: 195
Jak powinno wyglądać zapytanie, aby w wyniku otrzymać wszystkie towary wraz ze stanem (ilość) przy warunku WHERE Magazyny.IdMagazunu = 1?
Diagram tabel:
powinno składać się z selecta i odpowiednich złączeń (join)
W tym wypadku musisz wybrać:
wszystkie towary, i odpowiadające im stany
pokombinuj, tu masz typy złączeń:
http://www.w3schools.com/sql/sql_join.asp
Męczę się z tym dość długo i jedyne co udało mi się wykombinować to: na przykład przy trzech magazynach: wpisuję w tabelę MagazynyStany każdy towar trzykrotnie. Jeden wpis - z rzeczywistym stanem dla danego magazynu, a dwa pozostałe wpisy ze stanem 0. Wtedy przy zapytaniu:
SELECT dbo.Towary.Nazwa, dbo.MagazynyStany.Stan, dbo.Magazyny.IdMagazynu
FROM dbo.MagazynyStany INNER JOIN
dbo.Magazyny ON dbo.MagazynyStany.IdMagazynu = dbo.Magazyny.IdMagazynu RIGHT OUTER JOIN
dbo.Towary ON dbo.MagazynyStany.IdTowaru = dbo.Towary.IdTowaru
WHERE (dbo.Magazyny.IdMagazynu = 1)
zwraca pożądany wynik.
Bez dodawania dodatkowych wpisów (ze stanem 0) w tabeli MagazynyStany, w wyniku nie zwraca mi listy wszystkich towarów. Zamierzam uzyskać rezultat, gdzie w wyniku zawsze otrzymuję listę wszystkich towarów, a dodatkowo stan (ilości) danego magazynu:
mleko 55
jajka 20
cebula
bułki 18
mąka
a nie tylko te towary i ilości, gdzie został wpisany stan.
no to NVL powinien pomóc... a jak na Twojej bazie nie ma poszukaj alternatywy:
np dla mssql
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/e8a74b66-eedb-42cc-a9df-e2156698893f/nvl-in-sqlserver
void-tec napisał(a):
no to NVL powinien pomóc... a jak na Twojej bazie nie ma poszukaj alternatywy:
np dla mssql
http://social.msdn.microsoft.com/Forums/sqlserver/en-US/e8a74b66-eedb-42cc-a9df-e2156698893f/nvl-in-sqlserver
Nie chodzi mi o to, aby w tabeli pojawiło się 0, tylko o listę wszystkich towarów dodatkowo ze stanem dla danego magazynu: WHERE Magazyny.IdMagazunu = 1?
tak:
mleko 55
jajka 20
cebula
bułki 18
mąka
a nie tak:
mleko 55
jajka 20
bułki 18
Wydaję mi się, że tu powinien być też RIGHT OUTER a nie inner:
dbo.MagazynyStany INNER JOIN
a jak nie to spróbuj po kolei, zaczął bym od uycia dwóch tabel, tak naprawdę idmagazynu wyciągniesz ze stanów:
SELECT dbo.Towary.Nazwa, dbo.MagazynyStany.Stan--, dbo.Magazyny.IdMagazynu
FROM
dbo.Towary left outer join ON dbo.MagazynyStany.IdTowaru = dbo.Towary.IdTowaru
WHERE (dbo.MagazynyStany.IdMagazynu = 1)
potem jak chces to pokombinuj jak dodać trzecią
Zapytanie
SELECT dbo.Towary.Nazwa, dbo.MagazynyStany.Stan, dbo.MagazynyStany.IdMagazynu
FROM dbo.Towary LEFT OUTER JOIN
dbo.MagazynyStany ON dbo.MagazynyStany.IdTowaru = dbo.Towary.IdTowaru
WHERE (dbo.MagazynyStany.IdMagazynu = 1)
zwraca tylko te towary (a nie wszystkie), gdzie wpisany jest stan, więc na razie zostaję przy pomyśle wpisywania dodatkowych rekordów ze stanem 0 (tak jak napisałem wyżej).
@void-tec wielkie dzięki za zaangażowanie.
dzieje się tak dlatego, że idmagazynu umieszczasz jako warunek do całego zapytania (where) a nie jako warunek połączenia tabel:
SELECT t.Nazwa, ms.Stan, ms.IdMagazynu
FROM Towary t LEFT OUTER JOIN MagazynyStany ms ON (t.IdTowaru = ms.IdTowaru AND ms.IdMagazynu = 1)
Paweł Dmitruk napisał(a):
dzieje się tak dlatego, że idmagazynu umieszczasz jako warunek do całego zapytania (where) a nie jako warunek połączenia tabel:
SELECT t.Nazwa, ms.Stan, ms.IdMagazynu
FROM Towary t LEFT OUTER JOIN MagazynyStany ms ON (t.IdTowaru = ms.IdTowaru AND ms.IdMagazynu = 1)
Właśnie o to mi chodziło. Dziękuję za pomoc.