SELECT
操作を使用して値を割り当てるT-SQL変数があります。 "SELECT"クエリは複数の行を返す可能性があるため、すべての値をコンマで区切って追加するCOALESCE関数を使用しています。これまでのところ、すべての良いクエリは意図したとおりに動作しています。しかし、order by節を使用して値を順序付けしようとすると、1つの行だけが変数に追加されます。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 |
を行の変換が成功のために次のクエリを使用します。私はそれが*間違ったドキュメントにあると思うと頻繁に述べてきましたが、それはそこにありました。 SELECTリスト内のすべての式(代入を含む)が**出力行ごとに**正確に1回**実行されることは保証されていないためです" –