Pomoc przy utworzeniu zapytania

0

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

0

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

0

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.

0

a jaki zwraca bez dodania tych wpisów, zgaduję, że chodzi Ci o to, że zwraca puste wiersze i musisz dodać sztuczne wpisyy z zerami?
Spróbuj z NVL W oraclu to by było jakoś tak:
NVL(dbo.MagazynyStany.Stan,0)

0

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.

0

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

0
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
0

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ą

0

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.

2

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)
0
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.

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