1

私は2つのテーブルの間に多対多の関係を持っています。

テーブルGod_Restaurantsには私のレストランが含まれています。

God_RestaurantKatにはさまざまなカテゴリが含まれています。

テーブルGod_RestKatReferenceには、それぞれ2つのテーブルのIDを保持する2つの列が含まれています。

次のステートメントは私が思いつくことができるものですが、私が望む出力を私に与えません。

DECLARE @Names VARCHAR(8000) 
SELECT DISTINCT R.RestaurantID as Restaurantid, 
                R.RestaurantName as Restaurantname, 
                K.RestaurantKatName as RestKatName 
FROM God_Restaurants R 
LEFT JOIN God_RestKatReference as GodR ON R.RestaurantId = Godr.RestaurantId 
LEFT JOIN God_RestaurantKat as K ON GodR.RestaurantKatId = K.RestaurantKatId 
WHERE R.RestaurantPostal = 7800

出力はレストランに関する情報であり、最後の列にはカテゴリの連結行が必要です。

4

1 に答える 1

2

値を連結するには、を使用できますfor xml path('')。間違ったxmlパスソリューションがあります。特殊文字にはとを使用する必要がvalueあります。type

declare @Temp table (id int, Name nvarchar(max))
declare @date datetime
declare @i int

insert into @Temp
select 1, 'asasd' union all
select 1, 'sdsdf' union all
select 2, 'asdad' union all
select 3, 'asd<a?>&sdasasd' union all
select 3, 'fdgdfg'

select @i = 1
while @i < 9
begin
    insert into @Temp
    select id, Name from @Temp

    select @i = @i + 1
end

select count(*) from @Temp

select @date = getdate()

select
    A.id,
    stuff((select ', ' + TT.Name from @Temp as TT where TT.id = A.id for xml path(''), type).value('.', 'nvarchar(max)'), 1, 2, '') as Names
from @Temp as A
group by A.id

select datediff(ms, @date, getdate())

select @date = getdate()

select distinct
    A.id,
    stuff((select ', ' + TT.Name from @Temp as TT where TT.id = A.id for xml path(''), type).value('.', 'nvarchar(max)'), 1, 2, '') as Names
from @Temp as A

select datediff(ms, @date, getdate())

可変ソリューションを使用することもできます

declare @temp nvarchar(max)

select @temp = isnull(@temp + ', ', '') + str
from (select '1' as str union select '2' as str union select '3' as str) as A

select @temp
于 2012-10-17T18:32:54.313 に答える