w3schools usar outer left definicion cross como sql sql-server sql-server-2012 unpivot cross-apply

sql - usar - Pasa por una mesa usando Cross apply y UNION TODOS los resultados



outer apply sql w3schools (1)

Intentando escribir una consulta que se comportará como un foreach

Consulta :

select label ,NTILE(10) over(order by label ASC) Quartile INTO #labelTempTab from dbo.ReportFieldsLookup

Los datos serán como:

label Quartile ----- -------- la1 1 la2 1 la3 1 sa1 2 sa2 2 sq3 2 ha1 3 ha2 3 ha3 3 ka1 4 ka2 4 kas3 4

Continuación de la consulta:

DECLARE @sql nvarchar(max) SELECT * INTO #SetValuesTable FROM svo_tbl SET @sql = ''SELECT MNUM, Label , LabelValue ,[Property Type] FROM #SetValuesTable '' +'' CROSS APPLY ( VALUES '' + stuff(( SELECT '',(''''''+ replace(C.label,'''''''',''"'') + '''''','' + quotename(C.label) + '')'' FROM #labelTempTab c WHERE c.Quartile = 1 group by label FOR xml path('''')), 1, 1, '''') +'' ) AS UPTab (Label , LabelValue);'' EXEC(@sql)

La consulta anterior no se activará solo para Quartile = 1 ¿Cómo puedo hacer que funcione entre 1 y n y unir todos los resultados?

los datos en #SetValuesTable se verán así:

MNUM la1 la2 la3 sa1 sa2 sq3 ha1 ha2 ha3 ka1 ka2 Property Type 12 1 0 2 1 0 8 3 4 0 1 2 s 13 4 0 5 1 6 8 5 2 1 1 3 p

El resultado (salida esperada) debería verse como

MNUM Label LabelValue Property Type 12 la1 1 s 12 la2 0 s 12 la3 2 s 12 sa1 1 s 12 sa2 0 s 12 sa3 8 s ........ 13 ka1 1 p 13 ka2 1 p 12 ka3 3 p

continuación de la consulta:

SET @sql = @sql + '' INNER JOIN dbo.ReportFieldsLookup tt ON tt.label = Label'' SET @sql = @sql + ''INNER JOIN dbo.SplitStrings_Ordered(''''''''''09-404811,10-433495,10-433575,10-423789'''''''', '','') AS s ON #SetValuesTable.MNum = s.MNum ORDER BY s.[Index];

Las dos declaraciones anteriores están tomando mucho tiempo. Especialmente la última unión interna que es para ordenar está tardando mucho tiempo. Creo que el uso de cross apply podría reducir enormemente el tiempo de ejecución.


Use Cross Apply para evitar el resultado. La consulta de consulta dinámica debe construirse en este formato.

SELECT mnum, label, label_value, [Property Type] FROM #SetValuesTable CROSS apply(VALUES (''la1'',la1),(''la2'',la2),(''la3'',la3), (''sa1'',sa1),(''sa2'',sa2),(''sa3'',sa3), (''ha1'',ha1),(''ha2'',ha2),(''ha3'',ha3), (''ka1'',ka1),(''ka2'',ka2)) cs (label, label_value)

Dynamic query debería ser algo así como

DECLARE @label VARCHAR(max)='''', @sql NVARCHAR(max) SELECT @label += ''('' + '''''''' + label + '''''','' + label + ''),'' FROM (SELECT DISTINCT Isnull(label, '''') label FROM #labelTempTab)a SELECT @label = LEFT(@label, Len(@label) - 1) SET @sql= ''SELECT mnum, label, label_value, [Property Type] FROM #SetValuesTable CROSS apply(VALUES '' + @label + '') cs (label, label_value) '' EXEC Sp_executesql @sql

Nota: Dado que está generando una lista de valores de la tabla #labelTempTab , asegúrese de tener todas las etiquetas presentes en la tabla #SetValuesTable