2010-12-29 16 views
8

Ho una tabella che ha attributi basati su un valore-chiave. Esempio:SQL Server PIVOT sulla tabella valori-chiave

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

Quando seleziono da questo ottengo:

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

Mi chiedevo se potevo usare la sintassi PIVOT di trasformare questo in:

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

so che tutti i miei tavoli avranno le stesse chiavi. (Sfortunatamente non riesco a modificare facilmente la struttura della tabella. Questo è ciò che mi spinge a provare a usare PIVOTS).

Il grosso problema qui è che i pivot richiedono una funzione di aggregazione da utilizzare. C'è un modo per evitare questo? Ho completamente torto nel tentarlo? O c'è una soluzione migliore?

+0

Vuoi output di colonna fissa? Cioè, vuoi ruotare tutte le chiavi per un dato objectid? – gbn

risposta

7

Un pivot non sarà più veloce degli autoaggiunti ripetuti per un'uscita a colonna fissa.

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' 

Se si desidera utilizzare PIVOT, utilizzare solo MAX. Poiché hai una riga per oggetto/chiave, è comunque banale ed è lì per soddisfare il requisito PIVOT.

Se si desidera un perno sconosciuta numero di righe in colonne, allora è SQL dinamico (come da 2000 soluzioni SQL Server) o di farlo in codice client.

Se ogni oggetto ha un numero fisso di attributi, prenderei in considerazione la possibilità di avere una seconda tabella con colonne reali gestite da un trigger. Impacciato, ma rende la vita più facile per la lettura

+0

Ah ok. Supponevo che il tavolo girevole avesse una sorta di magia dietro di esso che lo rendesse più veloce. Mi limiterò a seguire la rotta self join. – Kyle

+0

È possibile utilizzare join esterni per questa soluzione. Se ti manca una chiave, l'intera riga di ID oggetto di output scomparirà con i join interni utilizzati qui. –

+0

@Sir Wobin: e sposta il filtro anche su JOIN ... – gbn

5

No, non è possibile evitare l'aggregato. SQL Server richiede un modo per combinare le numerose righe possibili in un unico valore. Si dispone di un valore ma la funzionalità PIVOT viene creata con molte righe in 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