Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Microsoft SQL Server / MSDE _ Łącznie dwóch tabel

Napisany przez: lukpio3 14.01.2017, 16:49:15

Witajcie,
Mam problem z pewnym prostym zapytaniem. Mam dwie tabele z tym że druga powstała później więc ma mniejszy zakres danych. Potrzebuję teraz zrobić selecta aby wyświetlić zawartość tabeli pierwszej w taki sposób aby po połączeniu z tabelą 2 pominął określone rekordy czyli wyświetla całą tabelę 1 natomiast wiersze które dają się połączyć z tabelą 2 warunkowo pominął. I mam takie zapytanie:

  1. SELECT Z.ID_ZAP, Z.DATA_1, Z_DATA_2 .....
  2. FROM ZAPYTANIA Z
  3. LEFT JOIN STATUSY S ON Z.ID_ZAP = S.ID_ZAP
  4. AND S.STATUS != 'Zakończono'
  5. ORDER BY ID_ZAP DESC


Pominąłem tu wypisywanie wszystkich danych (DATA_1, DATA_2 ...). W wyniku tego zapytania oczekiwałem że rekordy gdzie STATUS ma wartość 'Zakończono' zostaną pominięte. Natomiast tak się nie dzieje. Wyświetla wszystko wraz z rekordami gdzie status ma wartość Zakończono.

Napisany przez: mmmmmmm 14.01.2017, 19:31:58

Rozumiem, że tu masz dwa problemy. Pierwszy z tymi tabelami. Możesz go załatwić przez LEFT JOIN z użyciem NULL. Czyli:
SELECT n.* FROM nowa n LEFT JOIN stara s ON s.id=n.id WHERE s.id IS NULL

W tym drugim musisz doczytać jak się zachowuje warunek we WHERE, a jak w (LEFT) JOIN.
Pza tym, jak dajesz we WHERE warunek na tabelę z LEFT JOIN (oprócz sprawdzenia IS NULL), to tego LEFT możesz sobie darować...

Napisany przez: lukpio3 14.01.2017, 19:42:03

Jeżeli użyję klauzuli WHERE czyli zrobię:

  1. SELECT Z.ID_ZAP, Z.DATA_1, Z_DATA_2 .....
  2. FROM ZAPYTANIA Z
  3. LEFT JOIN STATUSY S ON Z.ID_ZAP = S.ID_ZAP
  4. WHERE S.STATUS != 'Zakończono'
  5. ORDER BY ID_ZAP DESC


To oczywiście nie pokazuje mi wierszy gdzie status jest równy Zakończono ale też nie pokazuje mi wierszy z pierwszej tabeli dla których w drugiej kompletnie nie ma nic a tak nie może być. Pokazuje mi wtedy wyłącznie część wspólną obu tabel co jest błędem. Siedzę, kombinuję, nie mogę tego rozgryźć. Bo tabela 1 ma kilkaset wierszy, tabela druga tylko kilkadziesiąt ponieważ była niedawno dołożona. Muszę wyświetlić wszystkie rekordy których nie mogę z JOIN-ować z tabelą 2 + rekordy które się JOIN-ują ale pod warunkiem że status z tabeli 2 jest różny od Zakończono.

Napisany przez: trueblue 14.01.2017, 21:08:08

  1. WHERE S.STATUS != 'Zakończono' OR S.STATUS IS NULL

Napisany przez: lukpio3 14.01.2017, 22:34:50

Co prawda rozwiązałem już problem poprzez kilka selectów ale to mało eleganckie rozwiązanie. Dodałem do tego co miałem Twój warunek i działa. Dzięki wielkie za pomoc. O to właśnie chodziło. Próbowałem robić tak jak napisałeś z NULL-em ale dawałem złe złączenie bo robiłem AND zamiast OR co było moim błędem. Jeszcze raz dziękuję smile.gif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)