Łączenie dwóch tabel

0

Witajcie,
Stanąłem przed pewnym problemem który zapewne da się jakoś rozwiązać tylko nie bardzo mam pomysł jak. Do tej pory miałem w swoim systemie jedną tabelę z której zaciągałem dane i po tych danych robiłem filtrowanie. Teraz po modyfikacji doszła mi druga tabela. Może pokażę jak to wygląda na przykładzie. Struktura tabel jest prosta. Tabela pierwsza którą już mam prezentuje się następująco:
ID DATA_1 DATA_1 DATA_3 ........
1
2
...
...
...
100
101
102

ID to klucz główny, kolumny DATA_x to kolumny w których znajdują się dane. Teraz doszła mi druga tabela która zawiera w sobie ID z pierwszej jako klucz obcy. Oczywiście ponieważ druga tabela doszła mi później, będzie miała mniejszy zbiór danych i prezentuje się następująco:
ID ID_TABLE_1 DATA_1 DATA_1 DATA_3 ........
1 100
2 101
3 102

Wszystkich danych które są poniżej ID 100 w pierwszej tabeli nie mam w drugiej. I teraz mam problem ponieważ gdy wykonuję zapytanie:

SELECT TOP 20 * FROM TABLE_1 T1
LEFT JOIN TABLE_2 T2 ON T1.ID = T2.ID_TABLE_1
WHERE
T2.DATA_1 != 'wartość' AND T2.DATA_2 != 'wartość'

zwracane są wyłącznie dane które są częścią wspólną obu tabel natomiast te które są tylko w tabeli pierwszej a nie mają połączenia z drugą, są po prostu pomijane. Jeżeli usunę klauzulę WHERE jest ok, jak tylko dodam tą klauzulę już ok nie jest. Szczerze to nie mam pomysłu jak to ugryźć. Pomożecie?

0
SELECT TOP 20 * FROM TABLE_1 T1
LEFT JOIN TABLE_2 T2 ON T1.ID = T2.ID_TABLE_1 AND T2.DATA_1 != 'wartość' AND T2.DATA_2 != 'wartość'
1

TABLE_1, DATA_1... Ty tak serio? Za pół roku nie będziesz mieć pojęcia, co tam trzymasz.

0
abrakadaber napisał(a):
SELECT TOP 20 * FROM TABLE_1 T1
LEFT JOIN TABLE_2 T2 ON T1.ID = T2.ID_TABLE_1 AND T2.DATA_1 != 'wartość' AND T2.DATA_2 != 'wartość'

Super, dzięki wielkie, wszystko działa :)

ŁF napisał(a):

TABLE_1, DATA_1... Ty tak serio? Za pół roku nie będziesz mieć pojęcia, co tam trzymasz.

Żartujesz? Oczywiście że nie. To był tylko przykład bo całe zapytanie jest dużo dużo dłuższe bo jest tam jeszcze choćby szereg warunków filtrujących. Napisałem jedynie prosty przykład żeby pokazać problem z którym się zmagam a reszta kodu mogła by tylko zaciemniać całość.

0

Cześć,
Chciałbym ponowić temat. Dałbym sobie głowę uciąć że sposób który podał @abrakadaber działał. Ale dziś zacząłem sobie testować i patrzę że mimo że mam w zapytaniu aby nie pobierał mi wierszy z konkretną wartością to ono mi je cały czas pobiera. Nawet zapytanie wykonane na bazie, nie z poziomu aplikacji nie działa i zwraca wiersze których zwrócić nie powinien pomimo tego że w zapytanie ma wyraźnie wskazane że ma pobierać wszystko to gdzie wartość w danej kolumnie jest różne wartości_1 i różne od wartość_2. Nie wiem jak to mogło przestać działać.

Wklejam poniżej swoje zapytania. Tak ono dokładnie wygląda:

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

Z.DATA_1 ... to są dane, nie wypisywałem ich żeby nie zaśmiecać zapytania bo tych danych jest ponad 100.

I to zapytanie pomimo tego że wyraźnie wskazuję że ma nie pobierać rekordów gdzie status jest pusty lub status ma wartość Zakończono to on i tak je pobiera.

0

A to przypadkiem nie powinien być INNER JOIN?

0

jeśli status jest null to warunek status != '' jest niespełniony. Bez konkretnych danych i zapytania nic więcej nie można powiedzieć

0

Dodaj jeszcze warunek że status nie jest null:

SELECT Z.ID_ZAP, Z.DATA_1, Z_DATA_2 .....
FROM ZAPYTANIA Z
LEFT JOIN STATUSY S ON Z.ID_ZAP = S.ID_ZAP
AND S.STATUS != '' AND S.STATUS != 'Zakończono' and S.STATUS IS NOT NULL
ORDER BY ID_ZAP DESC

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