SQLAnywhere 16 中的聚合结果(用于 XML 替换)

Aggregate results in SQLAnywhere 16 (For XML replacement)

提问人:Marianne Rojas 提问时间:7/11/2022 更新时间:7/11/2022 访问量:19

问:

我正在使用 Ultralite 16.0 并尝试将多行聚合为一行。

我有一个电影表和一个类型表,它们通过film_genre表具有多对多的关系。

我想要这样的结果:

| mFilm     | idGenre |
| --------- | ------- |
| Film_One  | 1, 2    |
| Film_Two  | 1, 3, 4 |

我可以在 SQL Server Management Studio (SSMS) 中轻松执行此操作

SELECT f.nmFilm, 
(
  REPLACE(
      STUFF(
          (SELECT g.idGenre FROM genre g
              JOIN film_genre fg on g.idGenre = fg.idGenre
              WHERE fg.idFilm = f.idFilm
              FOR XML PATH('')
          ) , 1 , 1 , ''
      )
  , '&', '&')
) AS genres FROM film f;

但是,每当我尝试在 SQLAnywhere 中使用 FOR XML 时,例如在下面的查询中

SELECT f.nmFilm, 
    (SELECT g.idGenre FROM genre g
      JOIN film_genre fg on g.idGenre = fg.idGenre
      WHERE fg.idFilm = f.idFilm
      FOR XML AUTO
    ) AS genres FROM film f;

我收到语法错误

无法执行语句。 [UltraLite 数据库]“XML”附近的语法错误 [SQL 偏移量:57] SQLCODE=-131,ODBC 3 状态=“42000” 第 1 行,第 1 列

我在文档中找不到任何对 FOR XML 的引用,因此我不确定这是否在 16.0 版中可用。

我怎样才能做到这一点?

SQLAnywhere UDB UltraLite

评论


答:

0赞 Marianne Rojas 7/11/2022 #1

如果其他人需要这个,我所要做的就是使用 LIST() 函数。

SELECT f.nmFilm, 
  (SELECT LIST(g.idGenre) FROM genre g
    JOIN film_genre fg on g.idGenre = fg.idGenre
    WHERE fg.idFilm = f.idFilm
  ) AS genres
FROM film f;