相当于 MySQL 中 SQL Server 的 STUFF 和 XML PATH

问题描述 投票:0回答:1

我有一个 SQL Server 数据库,我想将其转换/迁移到 MySQL。

我收到以下错误消息。

错误编号:1064
您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,了解在 'XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') FROM 附近使用的正确语法(在第 10 行选择 a3t'

SELECT DISTINCT task_id, members = STUFF(( SELECT N', ' + t.Ful FROM (SELECT teamAlpha.task_id, ( users.firstname   + ' ' + users.lastname ) as Ful FROM teamAlpha JOIN users ON users.user_id = teamAlpha.user_id ) t WHERE t.task_id = u.task_id FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') FROM (SELECT teamAlpha.task_id, ( users.firstname + ' ' + users.lastname ) as Ful FROM teamAlpha JOIN users ON users.user_id = teamAlpha.user_id ) u      

这是代码:

    $query = $this->db->query("
 SELECT DISTINCT
 task_id,
 members = STUFF((
      SELECT N', ' + t.Ful
      FROM (SELECT teamAlpha.task_id,
                     ( users.firstname  + ' ' + users.lastname ) as Ful
                FROM  teamAlpha
                JOIN users ON users.user_id = teamAlpha.user_id ) t
      WHERE t.task_id = u.task_id   
      FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM 
(SELECT teamAlpha.task_id,
         ( users.firstname  + ' ' + users.lastname ) as Ful
    FROM  teamAlpha
    JOIN users ON users.user_id = teamAlpha.user_id ) u");

    return $query->result();

SQL Server 中的

STUFF()
和 MySQL 中的
XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, ''
相当于什么?

php mysql sql-server codeigniter
1个回答
8
投票

您似乎只想生成与表格中给定任务相关的人员的 CSV 列表。您可以尝试以下查询:

SELECT
    ta.task_id,
    GROUP_CONCAT(u.firstname, ' ', u.lastname) AS fullname
FROM teamAlpha ta
INNER JOIN users u
    ON u.user_id = ta.user_id
GROUP BY
    ta.user_id;

请注意,必须使用

FOR XML PATH
的丑陋消失了。尽管SQL Server对分析函数有丰富的支持,但它对组串联的支持并不是很好。在 SQL Server 2017 中,有一个新函数
STRING_AGG
,它基本上与 MySQL 的
GROUP_CONCAT
执行相同的操作。

© www.soinside.com 2019 - 2024. All rights reserved.