我有一个T-SQL变量,我使用SELECT
操作为其分配值。由于“SELECT”查询可能返回多行,因此我使用COALESCE函数,该函数附加用逗号分隔的所有值。到目前为止,所有好的和查询都按预期运行。但是当我尝试使用order by子句来命令我的值时,只有一行被附加到变量。
为什么在查询2中添加Order By子句会产生与查询1不同的结果?
[结果1] :
球1,球2,球棒3,球棒1,球棒2
[结果2] :
蝙蝠1
JS小提琴链接:http://sqlfiddle.com/#!6/8dad1/15
[SQL小提琴] [1]
MS SQL Server 2014架构设置:
CREATE TABLE tbl_Trans
([Id] int, [Instrument] varchar(20), [Trans_Type] int, [Quantity] int);
CREATE TABLE tbl_Trans_Type
([Id] int, [Trans_Type] varchar(20));
INSERT INTO tbl_Trans ([Id], [Instrument], [Trans_Type], [Quantity])
VALUES
(1,'Ball 1', 121, 50),
(2,'Ball 2', 121, 20),
(3,'Bat 3', 122, 1000),
(4,'Bat 1', 124, 400),
(5,'Bat 2', 121, 300);
INSERT INTO tbl_Trans_Type ([Id], [Trans_Type])
VALUES
(121,'Buy'),
(122,'Sell'),
(123,'ReSell'),
(124,'Rent')
**Query 1**:
DECLARE @ST VARCHAR(500) = NULL
SELECT @ST = COALESCE(@ST+ ',' , '')+Instrument
FROM tbl_Trans a
LEFT JOIN tbl_Trans_Type b on a.Trans_Type = b.Id
SELECT @ST
[结果1] :
| Ball 1,Ball 2,Bat 3,Bat 1,Bat 2 |
查询2 :
DECLARE @ST2 VARCHAR(500) = NULL
SELECT @ST2 = COALESCE(@ST2+ ',' , '')+Instrument
FROM tbl_Trans a
LEFT JOIN tbl_Trans_Type b on a.Trans_Type = b.Id
ORDER BY IIF(b.Trans_Type='Buy',1,2)
SELECT @ST2
[结果2] :
| Bat 1 |
答案 0 :(得分:0)
如果你想连接但是要订购,请尝试这个:
SELECT STUFF
(
(
SELECT ',' +Instrument
FROM tbl_Trans a
LEFT JOIN tbl_Trans_Type b
on a.Trans_Type = b.Id
ORDER BY IIF(b.Trans_Type='Buy',1,2)
FOR XML PATH(''), TYPE
).value('.', 'VARCHAR(MAX)')
,1
,1
,''
);
答案 1 :(得分:0)
您所看到的行为是设计上的。在具有ORDER BY子句的查询中使用赋值操作(在此方案中连接)具有未定义的行为。
使用以下查询将行成功转换为逗号分隔值,并使用order by子句
select stuff((select ','+Instrument
FROM tbl_Trans a
LEFT JOIN tbl_Trans_Type b on a.Trans_Type = b.Id
ORDER BY IIF(b.Trans_Type='Buy',1,2)
for xml path('')) ,1,1,'')