9 AĞUSTOS 2008, CUMARTESİ
Nasıl " için SQL Server bir işlevi oluşturmak için;katılın" tek ayrılmış bir alana bir alt sorgu birden fazla satır?
Göstermek için, aşağıdaki gibi iki tablo var varsayalım
VehicleID Name
1 Chuck
2 Larry
LocationID VehicleID City
1 1 New York
2 1 Seattle
3 1 Vancouver
4 2 Los Angeles
5 2 Houston
Aşağıdaki sonuçları döndürmek için bir sorgu yazmak istiyorum:
VehicleID Name Locations
1 Chuck New York, Seattle, Vancouver
2 Larry Los Angeles, Houston
Bu sunucu yanı imleçler, yani kullanılarak yapılabilir biliyorum:
DECLARE @VehicleID int
DECLARE @VehicleName varchar(100)
DECLARE @LocationCity varchar(100)
DECLARE @Locations varchar(4000)
DECLARE @Results TABLE
(
VehicleID int
Name varchar(100)
Locations varchar(4000)
)
DECLARE VehiclesCursor CURSOR FOR
SELECT
[VehicleID]
, [Name]
FROM [Vehicles]
OPEN VehiclesCursor
FETCH NEXT FROM VehiclesCursor INTO
@VehicleID
, @VehicleName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Locations = ''
DECLARE LocationsCursor CURSOR FOR
SELECT
[City]
FROM [Locations]
WHERE [VehicleID] = @VehicleID
OPEN LocationsCursor
FETCH NEXT FROM LocationsCursor INTO
@LocationCity
WHILE @@FETCH_STATUS = 0
BEGIN
SET @Locations = @Locations @LocationCity
FETCH NEXT FROM LocationsCursor INTO
@LocationCity
END
CLOSE LocationsCursor
DEALLOCATE LocationsCursor
INSERT INTO @Results (VehicleID, Name, Locations) SELECT @VehicleID, @Name, @Locations
END
CLOSE VehiclesCursor
DEALLOCATE VehiclesCursor
SELECT * FROM @Results
Gördüğünüz gibi ancak, bu kod büyük bir anlaşma gerektirir. İstediğim bana böyle bir şey yapmak için izin verecek genel bir fonksiyonudur:
SELECT VehicleID
, Name
, JOIN(SELECT City FROM Locations WHERE VehicleID = Vehicles.VehicleID, ', ') AS Locations
FROM Vehicles
Bu mümkün mü? Ya da ona benzer bir şey?
CEVAP
10 AĞUSTOS 2008, Pazar
XML PATH komutunu kullanabilirsiniz 2005, SQL Server kullanıyorsanız.
SELECT [VehicleID]
, [Name]
, (STUFF((SELECT CAST(', ' [City] AS VARCHAR(MAX))
FROM [Location]
WHERE (VehicleID = Vehicle.VehicleID)
FOR XML PATH ('')), 1, 2, '')) AS Locations
FROM [Vehicle]
İmleci kullanarak çok daha kolay ve oldukça iyi iş gibi görünüyor.
Bunu Paylaş:
Nasıl bir kayıt (select top 1) Her kay...
Nasıl alt için birden fazla koşul veri...
Böyle büyük mükafat uyarı: "Birde...
Nasıl bir dize C / birden fazla satır ...
Nasıl "yinelenen OLMADAN birden f...