请您告诉我如何根据条件离开加入两张不同的牌桌?我感谢任何帮助。
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 :(得分: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中有多行用于任何ID,则会产生额外的行。
作为替代方案,通常效率较低,您也可以这样做:
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
会消除不必要的重复。
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:0)
由于要连接的表依赖于A.flag,因此您应该在join子句中应用该知识...
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