问题描述
我在表中有一个选择 n 条底部记录,并在同一行中返回一个连接值。 这是代码没问题但不返回 n 条底部记录:
SELECT
STUFF((
SELECT '; ' +
ISNULL(Val1,'') + '; ' +
ISNULL(Val2,'') + '; ' +
ISNULL(Val3,'') + '; ' +
ISNULL(Val4),'')
FROM Table_x
FOR XML PATH ('')),1,2,'') AS val;
我写了其他查询返回 n 条底部记录,但我需要将 KEPServerEX 与 ODBC 连接一起使用,并且它仅支持 SELECT 和 EXECUTE:
DECLARE @max_id INT
SELECT @max_id = MAX(id) FROM table_x
SET @max_id = @max_id - 20
SELECT
STUFF((
SELECT '; ' +
ISNULL(val1,'') + '; ' +
ISNULL(val2,'') + '; ' +
ISNULL(val3,'') + '; ' +
ISNULL(val4,14),'')
FROM
(
SELECT *
FROM table_x
WHERE id > @max_id
) AS Latest_rec
FOR XML PATH ('')),'') AS val;
我需要有一个很长的回报。例如: val1;val2 ; val3; val4;值1; val2; val3; val4.
我使用 Microsoft sql Server 2012 (SP3) - 11.0.6020.0 (X64) Express Edition(64 位)。但问题是 KEPServerEX 只接受 SELECT 和 EXECUTE。
目前,我没有找到其他查询返回 KEPServerEX 支持的同一行底部的 n 条记录。
解决方法
您可以通过使用 row_number()
窗口排名按 id 列的降序排列底部 n 行。我选择了底部 5 行。您可以随意选择。
SELECT
STUFF((
SELECT '; ' +
ISNULL(Val1,'') + '; ' +
ISNULL(Val2,'') + '; ' +
ISNULL(Val3,'') + '; ' +
ISNULL(Val4,''),'')
(select *,row_number()over(order by id desc) rn FROM Table_x)t
where rn=5
FOR XML PATH ('')),1,2,'') AS val;
如果您使用的是 SQL Server 2017 或更高版本,那么您可以使用 string_agg()
,它非常易于使用且速度更快。
SELECT string_agg(ISNULL(Val1,'') + '; ' + ISNULL(Val2,'') + '; ' + ISNULL(Val3,'') + '; ' + ISNULL(Val4,';')
from (select *,row_number()over(order by id desc) rn FROM Table_x)t
where rn=5
,
按 ID 排序时选择最后 20 行。以 ASC 顺序返回,带一个查询
SELECT
STUFF((
SELECT '; ' +
ISNULL(val1,'') + '; ' +
ISNULL(val2,'') + '; ' +
ISNULL(val3,'') + '; ' +
ISNULL(val4,14),'')
FROM
(
SELECT top(20) *
FROM table_x
ORDER BY id DESC
) AS Latest_rec
ORDER BY id ASC
FOR XML PATH ('')),'') AS val;