SELECT
을 사용하여 값을 할당 할 T-SQL 변수가 있습니다. "SELECT"쿼리는 여러 행을 반환 할 수 있으므로 모든 값을 쉼표로 구분하여 추가하는 COALESCE 함수를 사용하고 있습니다. 지금까지 모든 좋은 쿼리는 의도 한대로 동작합니다. 그러나 order by 절을 사용하여 값을 정렬하려고하면 변수에 한 행만 추가됩니다.COALESCE와 함께 사용할 때 주문이 영향을 미치는 방식은 무엇입니까
왜 쿼리 2의 Order By 절을 추가하면 쿼리 1과 다른 결과가 발생합니까?
[결과 1] :
볼 (1), 볼 (2), 배트 3 배트 1 배트 2
[결과 2] :
(210)박쥐 1
JS 바이올린 링크 : http://sqlfiddle.com/#!6/8dad1/15
[SQL 바이올린] [1]
MS SQL 서버 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] :
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
,''
);
에 의해 주문 쉼표로 구분 된 값으로 행을 성공적으로 변환 다음 쿼리를 사용합니다. SQL/t-sql/language-elements/set-local-variable-transact-sql #주의) (필자는 잘못 생각한 문서라고 생각하지만, 영원히) : "SELECT 문에서 변수를 사용하여 값을 연결하지 마십시오 [...] SELECT 목록의 모든 표현식 (** 포함)은 ** 각 출력 행에 대해 ** 정확히 한 번 ** 실행되도록 보장되지 않기 때문입니다 " –