2010-12-29 24 views
8

Tengo una tabla que tiene atributos basados ​​en una clave-valor. Ejemplo:SQL Server PIVOT en la tabla de valores-clave

CREATE TABLE ObjectAttributes 
(
    int objectId, key nvarchar(64), value nvarchar(512) 
) 

Cuando selecciono de este recibo:

objectId key  value 
---------------------------- 
1   Key 1 Value 1 
1   Key 2 Value 2 

Me preguntaba si podría utilizar la sintaxis de pivote para convertir esto en:

objectId Key 1  Key 2 
--------------------------- 
1   Value 1 Value 2 

Sé que todos mis tablas tendrán las mismas llaves. (Desafortunadamente no puedo cambiar fácilmente la estructura de la tabla. Esto es lo que me lleva a intentar usar PIVOTES).

El gran problema aquí es que los pivotes requieren una función de agregación para ser utilizados. ¿Hay alguna manera de evitar esto? ¿Estoy completamente equivocado al intentar esto? ¿O hay una mejor solución?

+0

¿Desea una salida de columna fija? Es decir, ¿quieres pivotar todas las claves para objectid dado? – gbn

Respuesta

7

Un pivote no será más rápido que las uniones repetidas para una salida de columna fija.

SELECT 
    T1.objectID, T1.Value AS Key1, T2.Value AS Key2 
FROM 
    ObjectAttributes T1 
    JOIN 
    ObjectAttributes T2 ON T1.objectID = T2.objectID 
WHERE 
    T1.key = 'Key 1' 
    AND 
    T2.key = 'Key 2' 

Si desea utilizar PIVOT, simplemente use MAX. Como tiene una fila por objeto/clave, de todos modos es trivial y está ahí para satisfacer el requisito PIVOT.

Si desea PIVOTAR número desconocido de filas en columnas, entonces es SQL dinámico (según las soluciones de SQL Server 2000) o lo hace en el código del cliente.

Si cada objeto tiene un número fijo de atributos, entonces consideraría tener una segunda tabla con columnas reales mantenidas por un disparador. Torpe, pero hace la vida más fácil de leer

+0

Ah bien. Asumía que la mesa pivote tenía algún tipo de magia detrás que la hacía más rápida. Voy a ir con la ruta de auto unión. – Kyle

+0

Es posible que desee utilizar uniones externas para esta solución. Si le falta una clave, toda la fila de ID de objeto de salida desaparecerá con las combinaciones internas utilizadas aquí. –

+0

@Sir Wobin: y mueva el filtro a JOIN también ... – gbn

5

No, no puede evitar el agregado. SQL Server necesita alguna forma de combinar las muchas filas posibles en un solo valor. Tiene un valor, pero la funcionalidad PIVOT está hecha con muchas filas en mente.

SELECT objectId, [Key 1], [Key 2] 
FROM 
(SELECT objectId, [key], value FROM ObjectAttributes) AS source 
PIVOT 
(
MIN(value) 
FOR [key] IN ([Key 1], [Key 2]) 
) as pvt