Sql 需要帮助改进以下查询(基于Cte的解决方案)

Sql 需要帮助改进以下查询(基于Cte的解决方案),sql,sql-server,sql-server-2005,tsql,common-table-expression,Sql,Sql Server,Sql Server 2005,Tsql,Common Table Expression,考虑下面的输入表 Id CountryName 1 India,Australia,Singapore,Pakistan,Bangaladesh 2 Norway,Argentina,Brazil,WestIndies,Burma 期望输出为 Id Country1 Country2 Country3 Country4 Country5 1 India Australia Singapore Pakistan Bangalades 2

考虑下面的输入表

Id  CountryName
1   India,Australia,Singapore,Pakistan,Bangaladesh
2   Norway,Argentina,Brazil,WestIndies,Burma
期望输出为

Id  Country1    Country2    Country3    Country4    Country5
1   India   Australia   Singapore   Pakistan    Bangalades
2   Norway  Argentina   Brazil  WestIndies  Burma
我已将查询写为在哪个条件下可以正常工作

;WITH cte AS (

SELECT 
Id,
CAST('<i>' + REPLACE(CountryName, ',', '</i><i>') + '</i>' AS XML) AS names
FROM @t
)

SELECT * FROM
(
SELECT 
Id,
x.i.value('.', 'VARCHAR(10)') AS Country,
'Country' + CAST(s.Number AS VARCHAR) AS CountryType
FROM cte
CROSS APPLY master..spt_values s 
CROSS APPLY names.nodes('//i[position()=sql:column("s.number")]') x(i)
WHERE s.type='p'
) a
PIVOT (
MAX(Country) FOR CountryType IN (Country1, Country2, Country3, Country4,Country5)
) pvt
但是性能非常差。。。 我正在寻找一种更好的查询,它可以加速这个过程,这可能不是我的xquery方法,而是其他只使用cTE而不使用RBar/procedural/while循环/游标方法的方法

即使是我,如果我的问题可以改进的话,我也很满意

N.B.~我不能在表上添加任何索引。请考虑这一点是对环境的限制。我要做的只是查询

注~可以有更多的国家,而不仅仅是5个

请帮忙

提前感谢

如果您有一个由四部分组成的字符串,则可以使用。。由于您有五个国家/地区,因此可以使用常规子字符串获取第一个国家/地区,然后将第一个国家/地区替换为。其余部分使用parsename

declare @T table(Id int,  CountryName varchar(50))
insert into @T values
(1,   'India,Australia,Singapore,Pakistan,Bangaladesh'),
(2,   'Norway,Argentina,Brazil,WestIndies,Burma')

select Id,
  substring(CountryName, 1, charindex(',', CountryName)-1) as Country1,
  parsename(T.N, 4) as Country2,
  parsename(T.N, 3) as Country3,
  parsename(T.N, 2) as Country4,
  parsename(T.N, 1) as Country5
from @T
  cross apply(select replace(stuff(CountryName, 1, charindex(',', CountryName), ''), ',', '.')) as T(N)
如果你知道你有8个国家,你可以这样做

declare @T table(Id int,  CountryName varchar(100))
insert into @T values
(1,   'India,Australia,Singapore,Pakistan,Bangaladesh,Denmark,Germany,France'),
(2,   'Norway,Argentina,Brazil,WestIndies,Burma,South Africa,Spain,Portugal')


select Id,
  parsename(T1.N, 4) as Country1,
  parsename(T1.N, 3) as Country2,
  parsename(T1.N, 2) as Country3,
  parsename(T1.N, 1) as Country4,
  parsename(T2.N, 4) as Country5,
  parsename(T2.N, 3) as Country6,
  parsename(T2.N, 2) as Country7,
  parsename(T2.N, 1) as Country8
from @T
  cross apply(select charindex(',', CountryName, charindex(',', CountryName, charindex(',', CountryName, charindex(',', CountryName)+1)+1)+1)) as S(P)
  cross apply(select replace(substring(CountryName, 1, S.P-1), ',', '.')) as T1(N)
  cross apply(select replace(stuff(CountryName, 1, S.P, ''), ',', '.')) as T2(N)
如果您不知道有多少国家/地区,则需要动态构建查询