[英]SQL Server : use CTE as subquery to compress rows into concatenated string
我正在重寫一個寫得不好的應用程序的幾頁,我試圖將此邏輯作為子查詢合並到主查詢中,以便我可以一口氣獲取所有數據,而不必像當前代碼那樣連接50K次。
我開始與
DECLARE @combinedString NVARCHAR(MAX),@mds NVARCHAR(MAX)
SELECT
@combinedString = COALESCE(@combinedString + ', ', '') + serial,
@mds = MDS
FROM
(aircraftserials
LEFT JOIN
serialnums ON serialnums.ID = aircraftserials.Serialnum_ID)
WHERE
(85 = aircraftserials.Aircraft_ID AND serial IS NOT NULL)
我想消除這些變量並使它成為子查詢,
我認為我需要CTE; 最終結果必須是
MDS, concatenated serials
我已經試過這篇文章,但不能完全理解簡化CTE字符串串聯嗎?
這是數據樣本
CREATE TABLE TestBed
(
Aircraft_ID INT,
Serial VARCHAR(50),
MDS VARCHAR(50)
)
INSERT INTO TestBed (Aircraft_ID, Serial, MDS)
VALUES (85, '56-1965', 'T-37B'),
(85, '56-1967', 'T-37B'),
(85, '56-3547', 'T-37B'),
(85, '56-3577', 'T-37B'),
(85, '57-2265', 'T-37B'),
(85, '57-2272', 'T-37B'),
(85, '58-1915', 'T-37B'),
(85, '58-1925', 'T-37B'),
(85, '59-0249', 'T-37B'),
(85, '59-0273', 'T-37B'),
(85, '59-0299', 'T-37B')
select * from TestBed
我認為您不是在尋找CTE,而是在尋找帶有字符串連接的聚合。 在SQL Server中,可以使用子查詢FOR XML
來完成。
SELECT tb1.aircraft_id,
stuff((SELECT concat(', ', tb2.serial)
FROM testbed tb2
WHERE tb2.aircraft_id = tb1.aircraft_id
AND tb2.mds = tb1.mds
FOR XML PATH ('')), 1, 2, '') serial,
tb1.mds
FROM testbed tb1
GROUP BY tb1.aircraft_id,
tb1.mds;
順便說一句:如果每架飛機的mds
始終相同,則它不應在testbed
而應在飛機表中。
我根據您的測試數據提出了一個遞歸CTE
;with ForceId as
(SELECT ROW_NUMBER() OVER(partition by MDS order by serial) as RN,* FROM TestBed),
RECURS as
(SELECT f.MDS,f.RN,f.Serial, cast(f.serial as nvarchar(max)) as x FROM ForceId F WHERE F.RN = 1
UNION ALL
SELECT f2.mds,f2.rn, r.Serial,r.x + ', ' + f2.Serial FROM ForceId F2
JOIN RECURS R
ON F2.mds = R.mds
AND R.RN + 1 = F2.rn
)
SELECT MDS, x FROM
recurs r where r.rn =
(select max(r2.rn) from recurs r2 where r.MDS = r2.mds)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.