【问题标题】:SQL query issue with case [duplicate]案例的 SQL 查询问题 [重复]
【发布时间】:2013-01-24 15:49:41
【问题描述】:

您能否告诉我如何根据条件左连接两个不同的表?感谢您的帮助。

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

【问题讨论】:

  • 这里需要一些动态 SQL。

标签: sql sql-server tsql


【解决方案1】:

你不能。但是你可以连接两个表,然后在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

如果表 2 或表 3 中的任何 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 将消除不需要的重复项。

【讨论】:

  • 您可能还需要过滤掉任何一个连接表中没有相关行的行。在这种情况下,OP 的预期结果并不明确。如果需要,一个简单的WHERE B.fname IS NOT NULL OR C.fname IS NOT NULL 应该可以工作。
  • 谢谢。 TableB 是 DRAFT 表。 TableB 和 TableC 列是相同的。两个表中可能存在同一个人。我正在尝试根据 FLAG 返回结果。
【解决方案2】:
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

【讨论】:

  • 看起来应该这样做。谢谢
  • 如何加入 lname 和 fname? fname + ' ' + 全名。加入 fname 和 lname 时出现模棱两可的列错误。
【解决方案3】:

你不能直接做。然而,有一种完全不直观的方式实际上是有效的。您使用不同的条件进行左连接并合并。像这样。

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

【讨论】:

  • 这不起作用。看看另一个答案。 . .条件不是第一个连接是否有效,而是基于第一个表中的标志。
【解决方案4】:

由于要连接的表依赖于 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2011-01-07
    • 2022-01-02
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多