我有一个 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, ''
相当于什么?
您似乎只想生成与表格中给定任务相关的人员的 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
执行相同的操作。