Considere o seguinte conjunto, que é o conteúdo da variável de tabela @ProductContent que acabou de ser criada para a consulta executada nela:
Observe como os itens são classificados por media_type_id, image_weight, image_id e finalmente image_width DESC. Se eu executar a seguinte consulta:
SELECT -- <images>
pcs.image_type AS [@Type]
,pcs.image_type_id AS [@ImageTypeId]
,(
SELECT -- <imageCollection>
pcc.image_id AS [@Guid]
,pcc.image_angle AS [@Angle]
,pcc.image_weight AS [@Weight]
,(
SELECT -- <image>
pci.mime_type AS [@MimeType]
,pci.content_guid AS [@Guid]
,pci.url AS [@Url]
,pci.media_type_id AS '@MediaTypeId'
,t.media_type_description '@Description'
,(
SELECT DISTINCT -- <attribute>
a.meta_attribute_id '@Id'
,a.meta_attribute_name '@Name'
,v.meta_value_name AS '@Value'
FROM [ADS2].dbo.ads_digital_content_meta m
JOIN [ADS2].dbo.ads_digital_content_meta_atr_voc a ON a.meta_attribute_id = m.meta_attribute_id
JOIN [ADS2].dbo.ads_digital_content_meta_value_voc v ON v.meta_value_id = m.meta_value_id
WHERE m.content_guid = pci.content_guid
FOR XML PATH('Attribute'), TYPE)
FROM
@ProductContent pci
JOIN [ADS2].dbo.ads_digital_content_media_type t ON t.media_type_id = pci.media_type_id
WHERE
pci.image_id = pcc.image_id
GROUP BY pci.content_guid, pci.mime_type, pci.url, pci.media_type_id, pci.image_width, t.media_type_description
FOR XML PATH('Image'), TYPE)
FROM @ProductContent pcc
WHERE pcc.image_type_id = pcs.image_type_id
AND pcc.product_id = pc.product_id
GROUP BY
pcc.product_id
,pcc.image_weight
,pcc.image_id
,pcc.image_angle
FOR XML PATH('ImageCollection'), TYPE)
FROM @ProductContent pcs
WHERE pcs.media_type_id = 15
AND pcs.product_id = pc.product_id
GROUP BY
pcs.image_type,
pcs.image_type_id
FOR XML PATH('Images'), TYPE
Por algum motivo as imagens não saem na ordem correta. Por exemplo, a imagem com largura 400 vem primeiro, em vez da largura 640. Minha pergunta é, que parte desta consulta está mudando a ordem da forma como está em @ProductContent? Prefiro apenas classificar uma vez antes de inserir em @ProductContent, pois as cláusulas order by na consulta XML são um grande impacto no desempenho.
Sem uma cláusula ORDER BY , a ordem em que os valores são retornados não será confiável, pois eles podem ser influenciados por índices e pelas páginas de dados nas quais as linhas individuais são armazenadas.
Se você precisar que os dados estejam em uma ordem específica, use a cláusula ORDER BY .