【问题标题】:Concatenate 2 rows into one in SQL在 SQL 中将 2 行连接为 1 行
【发布时间】:2022-01-10 01:03:00
【问题描述】:

我有一个非常简单的数据结构,只有 3 个表:

  • 请求
  • 员工
  • 团队

基本上,我需要将 2 个不同的 SQL 选择连接成一个(这样查询就可以只返回一行)。

如果有员工与请求相关联,则返回他们的姓名(职务)并将其与“/”连接。

然后,如果有负责该请求的团队,也返回其标题。

最后,将这两个属性合并为一个

我能做的最好的就是:

(SELECT CONCAT(e.title, ' / ') FROM employees AS e
    WHERE e.id = (SELECT r.resposible_employee_id FROM requests AS r WHERE r.id = 1))
UNION    
(SELECT t.title FROM teams AS t
    WHERE t.id = (SELECT r.responsible_team_id FROM requests AS r WHERE r.id = 1))

但它返回 2 行而不是 1 行

我可以通过两次查询数据库来单独进行连接,但这不是我想要的。我只想查询数据库一次。

为了您的方便,这里是SQL Fiddle

查询应该只返回一行

John Doe / Johns team

提前致谢

【问题讨论】:

  • 感谢您提供的示例小提琴,但是单行可能不足以准确说明全部要求?

标签: sql sql-server select union


【解决方案1】:

你追求的是下面的东西吗?

select 
    Concat_Ws(' / ',
        (select title from employees e where e.id=r.resposible_employee_id),
        (select title from teams t where t.id=r.responsible_team_id)
    )
from requests r 
where id=1

Modified SQL Fiddle

还怀疑 respo(n)sible_employee_id 是错字

【讨论】:

  • 您好,感谢一百万的回答。查询看起来很优雅并且工作得很好。是的,有一个错字,但那是一个模拟数据库,没关系
  • 好吧,真正的数据库似乎已经过时并且没有这样的功能。你能重写最通用的解决方案吗?
  • 假设您在提供 SQL2017 Fiddle 时对 concat_ws 没问题,但只需使用 'concat` 并在子查询之间添加 ' / ',就像您最初使用的那样。
  • 据我所知,concat_ws 相对于简单的concat 的主要优势是前者仅在两个参数不为空时才使用分隔符,纯concat 分别连接。如果我将' / ' 放在子查询之间并且team 为空,它会给出employeeName /。另一方面,如果 employee 为 null,则返回 / teamName 。但我敢打赌,没有可读的解决方法,所以我只是在第一个子查询中使用了' / '(因为团队为空而员工不为空的可能性要小得多)。
  • 我可以想到一些优雅的解决方法,使用 nullifouter apply 而不是内联子查询 - 很难真正理解和测试(如上所述)只有单行数据。您可能会将其连接到每个字符串的开头,然后使用 stuff 从最终字符串的开头删除
【解决方案2】:

您可以对相关表执行几个外连接。例如:

SELECT 
  case when e.id is null
    then coalesce(t.title, 'no information')
    else case when t.id is null then e.title 
           else concat(r.resposible_employee_id, ' / ', t.title) 
         end
    end
FROM requests r
LEFT JOIN employees e on e.id = r.resposible_employee_id
LEFT JOIN teams t on t.id = r.responsible_team_id
WHERE r.id = 1

结果:

2 / Johns team

请参阅SQL Fiddle 的运行示例。

SELECT 子句中的CASE 表达式应考虑相关表中找到/未找到数据的所有可能组合。根据需要进行调整。

【讨论】:

    猜你喜欢
    • 2012-03-26
    • 1970-01-01
    • 1970-01-01
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多