2017-02-08 8 views
3

Попытка создать хранимую процедуру, которую я могу использовать для поиска людей по имени и фамилии. Fname и Lname хранятся вместе в двух разных таблицах, которые хотят извлечь из Table1, и если нет совпадения, то вытащите из Table2 результаты.Вытягивание результатов из двух таблиц, если первая таблица не соответствует

@FName VARCHAR(20) = NULL 
@LName VARCHAR(20) = NULL, 

SELECT TB1.ID, TB1.FName, TB1.LName 

FROM Table1 TB1 
     LEFT JOIN Table2 TB2 
      ON TB1.ID = TB2.ID 

WHERE 1=1 
     AND COALESCE(TB1.Fname, '') LIKE '%' + REPLACE(COALESCE(@FName, TB1.Fname, ''), ' ', '%') + '%' 
     AND COALESCE(TB1.Fname, '') LIKE '%' + REPLACE(COALESCE(@LName, TB1.Fname, ''), ' ', '%') + '%' 

То, что я пробовал до сих пор, было таким, и оно, кажется, оттягивает все записи.

WHERE 1=1 
     AND COALESCE(TB1.Fname, '') LIKE '%' + REPLACE(COALESCE(@FName, TB1.Fname, ''), ' ', '%') + '%' 
     OR COALESCE(TB2.Fname, '') LIKE '%' + REPLACE(COALESCE(@FName, TB2.Fname, ''), ' ', '%') + '%' 
     AND COALESCE(TB1.Lname, '') LIKE '%' + REPLACE(COALESCE(@LName, TB1.Lname, ''), ' ', '%') + '%' 
     OR COALESCE(TB2.Lname, '') LIKE '%' + REPLACE(COALESCE(@LName, TB2.Lname, ''), ' ', '%') + '%' 

Любая помощь или руководство будет благодарен, я имею Google за последний день или около того, но я предполагаю, что я не тот прибегая к помощи вещей.

+0

Возможно, вы захотите переместить условия WHERE в предложение ON. – jarlh

ответ

2

Вы должны использовать Full Join, убедившись, что вы объединяете результаты, чтобы они извлекали данные из любой таблицы.

SELECT Coalesce(TB1.ID, TB2.ID) As ID, 
     Coalesce(TB1.FName, TB2.FName) As FName, 
     Coalesce(TB1.LName,TB2.LName) As LName 
FROM Table1 TB1 
     Full JOIN Table2 TB2 
      ON TB1.ID = TB2.ID 
+0

Это другой способ взглянуть на него, не прочь попробовать. – poohbear

1

После игры с ним вокруг на некоторое время и, глядя на то, что отправил G Mastros, это заставило меня думать о том, как я пытался вызвать две OR заявления, когда на самом деле все, что мне нужно было один. Поэтому я немного изменил заявление COLESCE и разместил их в одном OR, который в свою очередь дал мне необходимые результаты.

Я чувствую, что это работа с возможностью добавления другого запроса по мере необходимости, например, если мне нужно искать по электронной почте или номеру телефона.

DECLARE @FName VARCHAR(100) 
DECLARE @LName VARCHAR(100) 

SET @FName = 'Adam' 
SET @LName = NULL, 

SELECT TB1.ID, 
     COALESCE(TB1.FName,TB2.FName) AS FirstName 
     ,COALESCE(TB1.LName,TB2.LName) AS LAstName 

FROM Table1 TB1 
     INNER JOIN Table2 TB2 
      ON TB1.ID = TB2.ID 

WHERE 1=1 
    AND 
     (
     COALESCE(U.Unit_Owner_FName, '') LIKE '%' + COALESCE(@FName, U.Unit_Owner_FName, '') + '%' 
      AND COALESCE(U.Unit_Owner_LName, '') LIKE '%' + COALESCE(@LName, U.Unit_Owner_LName, '') + '%' 

     OR 

     COALESCE(I.Insured_FName, '') LIKE '%' + COALESCE(@FName, I.Insured_FName, '') + '%' 
      AND COALESCE(I.Insured_LName, '') LIKE '%' + COALESCE(@LName, I.Insured_LName, '') + '%' 
     ) 
Смежные вопросы