【问题标题】:SQL join on condition有条件的 SQL 连接
【发布时间】:2014-11-14 19:21:49
【问题描述】:

我正在尝试将一个字段(在表 1 中)连接到表 2 或表 3,具体取决于表 1 中另一个字段的值。

我的 COMM 表 (1) 如下所示:

CommID  User ID  Type
100     987      SER
101     123      EMP

SER (2) 和 EMP (3) 将为我提供有关这些用户的信息。我需要将 COMM 表中的 User ID 连接到 SEREMP,这取决于 COMMM 中的 Type 字段。这不起作用,但可以说明我正在尝试做的事情:

SELECT *
CASE 
   WHEN comm.type = 'SER' THEN ser.userName 
   ELSE emp.userName
END
FROM COMM
LEFT JOIN SER on SER.userID = comm.UserID and comm.type = 'SER'
LEFT JOIN EMP on EMP.userID = comm.UserID and comm.type = 'EMP'

有什么想法吗?

【问题讨论】:

  • 请格式化您的代码。

标签: sql if-statement join conditional case


【解决方案1】:

您应该将* 列限制为仅来自comm 的列,然后添加来自其他表的列:

select comm.*,
CASE WHEN comm.type = 'SER' THEN ser.userName ELSE emp.userName END
FROM COMM
LEFT JOIN SER on SER.userID = comm.UserID and comm.type = 'SER'
LEFT JOIN EMP on EMP.userID = comm.UserID and comm.type = 'EMP'

【讨论】:

  • 我在 * 之后确实有一个逗号。我只是把它排除在外。该语句的语法是正确的。我得到了结果。只是结果不对。对于类型中带有 EMP 的行,我得到了正确的答案,但是对于我知道类型中有 SER 的一行中的值,我得到了 NULL。
  • 请记住,这将返回 SER 和 EMP 表中的所有列。您可能希望它实际上是“SELECT COMM.*”,以便仅从 COMM 中选择所有列。
  • 语法看起来正确。您要为哪些字段设置空值? SER 表中有匹配的记录吗?
【解决方案2】:

在这种情况下,我个人会使用UNION -- probalby UNION ALL

SELECT 
  comm.*,
  ser.userName
FROM 
  comm
  JOIN 
    SER 
  ON 
     SER.userID = comm.UserID
WHERE
  comm.type = 'SER'
UNION ALL
SELECT 
  comm.*,
  emp.userName
FROM 
  coom
  JOIN 
    emp 
  ON 
     emp.userID = comm.UserID
WHERE
  comm.type = 'EMP'
;

这将适用于两个表中的类型兼容(如果是用户名,它们应该)。

UNION ALLSELECTS 中选择所有行——它不排除重复项(我认为这里可能不是真正的重复项)。

【讨论】:

  • 我可以看到 UNION 从哪里得到我需要的东西,但这是一个更大的查询的一小部分,所以我希望一些不那么复杂:(
  • 我发现了我的问题。我使用了错误的字段。啊啊啊!!!问题解决了。谢谢!
猜你喜欢
  • 1970-01-01
  • 2013-05-18
  • 2014-12-25
  • 2011-03-29
  • 2023-04-10
  • 2019-04-29
  • 2013-03-16
相关资源
最近更新 更多