Szukam dołączenia, aby zrobić lewe połączenie na dwóch stołach. Opis łańcucha w jednej tabeli zawiera identyfikator UID innej tabeli. Chcę wykonać lewe połączenie tylko wtedy, gdy opis pasuje do UID. Muszę zwrócić wszystkie rekordy w tabeli Transakcje. Czy możliwe jest użycie instrukcji IF lub warunkowej do dołączenia tabel, w przeciwnym razie pozostawienie pól jako pustych?
Oto skrzypce: http://sqlfiddle.com/#!3/aaa38/5
Tabela transakcji:
posted_date person_id description
2015-11-01 2 BZ#1414 Description 1414
2015-11-01 2 Another type of transaction with spaces in it
2015-11-01 3 BZ#1313 Another description 1313
2015-11-01 3 Another_description_without_spaces
Tabela szczegółów transakcji:
id person_id description
1414 2 additional stuff for 1414
1313 3 additional stuff for 1313
Wyniki powinny wyglądać tak:
posted_date person_id description id person_id description
2015-11-01 2 BZ#1414 Des... 1414 2 additional...
2015-11-01 2 Another typ... NULL NULL NULL
2015-11-01 3 BZ#1313 Ano... 1313 3 additional...
2015-11-01 3 Another_des... NULL NULL NULL
Odpowiedzi:
0 dla odpowiedzi № 1Łączenie się w ten sposób naprawdę oznacza, że struktura tabeli Transakcje nie jest dobra (powinna istnieć osobna kolumna dla pola, którego można użyć do dołączenia do szczegółów transakcji).
Powiedziawszy to, wciąż możesz osiągnąć to, co chcesz. Możesz dołączyć, gdy zaczyna się opis BZ#
a następnie dołącz do tego, co następuje, biorąc długość id, aby wyodrębnić liczbę. Jest to lepsze niż próba znalezienia spacji w opisie, ponieważ może nie być żadnych spacji.
Lewe sprzężenie zrobi resztę i wypełni pola z tran_details wartościami null, jeśli nie było dopasowania.
select *
from
transactions t
left join tran_details d
on t.person_id = d.person_id
and left(t.description, 3) = "BZ#"
and substring(t.description, 4, len(cast(d.id as nvarchar(50)))) = d.id
Zakładałem, że chcesz dołączyć, jeśli BZ#
po nim następuje id z tabeli szczegółów.
0 dla odpowiedzi nr 2
Poniższe zapytanie zadziała, o ile pierwsze 3 znaki to „BZ #” w kolumnie Transaction.Description
wybierz * z Transakcji t lewe sprzężenie zewnętrzneSzczegóły_transakcji td na t.person_id = td.person_id i left (t.description, 3) = „BZ #” i REPLACE (SUBSTRING (t.description, 0, CHARINDEX („”, t.description, 0)), „BZ #”, „”) = td.id