SQL查询问题与案例

时间:2013-02-08 19:34:44

标签: sql sql-server tsql

请您告诉我如何根据条件离开加入两张不同的牌桌?我感谢任何帮助。

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

4 个答案:

答案 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