Tenir compte de la table d'entrée ci-dessousBesoin d'aide pour améliorer la requête ci-dessous (solution Cte)
Id CountryName
1 India,Australia,Singapore,Pakistan,Bangaladesh
2 Norway,Argentina,Brazil,WestIndies,Burma
sortie souhaité être
Id Country1 Country2 Country3 Country4 Country5
1 India Australia Singapore Pakistan Bangalades
2 Norway Argentina Brazil WestIndies Burma
Je writen la requête en vertu de laquelle fonctionne bien
;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
Mais par la performance c'est très mauvais ... Je cherche une meilleure requête qui peut accélérer le processus (qui peut ne pas être l'approche xquery de ma mais l'autre approche en utilisant cTE seulement et aucune approche RBar/procedural/while loop/cursor)
Même si je suis d'accord si ma requête peut être améliorée. NB: Je ne peux pas ajouter d'indexation sur la table. Veuillez considérer ce point comme une limitation de l'environnement. Tout ce que j'ai à faire est avec la requête seulement.
NB ~ Il peut y avoir plus de pays et ne se limite pas à 5
S'il vous plaît aider ....
Merci à l'avance