2013-02-08 3 views
1

Не могли бы вы дать мне знать, как лежать, присоединиться к двум различным таблицам на основе условия? Я ценю любую помощь.Проблема с SQL-запросом с футляром

SELECT A.id, 
     A.flag, 
     B.fname, 
     B.lname 
FROM Table1 A 
     CASE 
      WHEN ISNULL(A.flag, 0) = 0 THEN LEFT 
     JOIN Table2 B 
      ON B.id = A.id 
       ELSE 
     LEFT JOIN Table3 B 
      ON B.id = A.id 
+0

Вы будете нуждаться в какой-то динамический SQL здесь. – Kermit

ответ

0
SELECT A.id, 
     A.flag, 
     CASE 
      WHEN ISNULL(A.flag, 0) = 0 THEN B1.fname 
      ELSE B2.fname 
     END as fname, 
     CASE 
      WHEN ISNULL(A.flag, 0) = 0 THEN B1.lname 
      ELSE B2.lname 
     END as lname 
FROM Table1 A 
     LEFT JOIN Table2 B1 
      ON B1.id = A.id 
     LEFT JOIN Table3 B2 
      ON B2.id = A.id 

Попробуйте это:

CASE 
     WHEN ISNULL(A.flag, 0) = 0 THEN B1.fname + ' ' + B1.lname 
      ELSE B2.fname + ' ' + B2.lname 
     END as name 
+0

Похоже, это должно это сделать. Спасибо – nav100

+0

Как присоединиться к lname и fname? имя_файла + '' + имя. Я получаю неоднозначную ошибку столбца, когда я присоединяюсь к fname и lname. – nav100

+0

@ nav100 проверьте выше – brykneval

2

Вы не можете. Но вы можете объединять обе таблицы, а затем выберите значение, которое вы хотите в пункте select:

SELECT A.id, A.flag, 
     (case when coalesce(A.flag, 0) = 0 then b.fname else c.fname end) as fname, 
     (case when coalesce(A.flag, 0) = 0 then B.lname else c.lname end) as lname 
FROM Table1 A left outer join 
    Table2 B 
    on B.id = A.id left outer join 
    Table3 C 
    on c.id = A.id 

Это будет производить дополнительные строки, если есть несколько строк в Table2 или Table3 для любых идентификаторов.

Подобно тому, как альтернатива, которая, как правило, быть менее эффективным, вы также можете сделать:

select a.id, a.flag, 
     MAX(case when coalesce(A.flag, 0) = 0 and which = 'b' or 
        coalesce(A.flag, 0) <> 0 and which = 'c' 
       then b.fname 
      end) as fname, 
     MAX(case when coalesce(A.flag, 0) = 0 and which = 'b' or 
        coalesce(A.flag, 0) <> 0 and which = 'c' 
       then b.lname 
      end) as lname 
from table1 A left outer join 
    ((select b.*, 'b' as which from table2 b) 
     union all 
     (select c.*, 'c' as which from table3 c) 
    ) b 
group by a.id, a.flag 

group by устранит нежелательные дубликаты.

+0

Вам также может потребоваться отфильтровать строки, не имеющие корреляционной строки в любой из объединенных таблиц. Желаемый результат OP не ясен в этом сценарии. Простое 'WHERE B.fname IS NOT NULL ИЛИ C.fname NOT NULL' должно работать, если это необходимо. – cdhowie

+0

Спасибо. Таблица Б представляет собой таблицу ПРОЕКТА. Столбцы TableB и TableC одинаковы. В обеих таблицах может быть одно и то же лицо. Я пытаюсь вернуть результаты на основе FLAG. – nav100

0

Вы не можете сделать это непосредственно. Тем не менее, существует совершенно неинтуитивный способ, который действительно работает. Вы оставляете соединения, используя разные условия, и объединяетесь. Что-то вроде этого.

select a.id 
, coalesce(c.name, b.name, 'no name found') name 

from tableA a left join tableB b on a.field1 = b.field1 
left join tableC c on a.field1 = c.field2 

etc 
+0

Это не работает. Посмотрите на другой ответ. , , условие не зависит от того, работает ли первое соединение, оно основано на знаке в первой таблице. –

0

Поскольку таблица присоединиться зависит от A.flag, вы должны применять эти знания в соединении п ...

SELECT A.id, A.flag, 
    fname = coalesce(t2.fname, t3.fname), 
    lname = coalesce(t2.lname, t3.lname) 
FROM Table1 A 
LEFT JOIN Table2 t2 on t2.id = A.id and isnull(A.flag, 0) = 0 
LEFT JOIN Table3 t3 on t3.id = A.id and isnull(A.flag, 0) = 1 
Смежные вопросы