Interroga una tabella di unione con campi come colonne
-
09-06-2019 - |
Domanda
Non sono del tutto sicuro che ciò sia possibile o che rientri nella categoria delle tabelle pivot, ma ho pensato di andare dai professionisti per vedere.
Ho tre tabelle di base:Carta, Proprietà e CardProperty.Poiché le carte non hanno le stesse proprietà e spesso più valori per la stessa proprietà, ho deciso di utilizzare l'approccio della tabella di unione per archiviare i dati invece di avere una struttura di colonne molto grande nella mia tabella delle carte.
La tabella delle proprietà è una tabella di tipo parola chiave/valore di base.Quindi hai la parola chiave ATK e il valore ad essa assegnato.Esiste un'altra proprietà chiamata SpecialType per la quale una carta può avere più valori, come "Sycnro" e "DARK"
Quello che mi piacerebbe fare è creare una vista o una procedura memorizzata che mi fornisca l'ID della carta, il Nome della carta e tutte le parole chiave delle proprietà assegnate alla carta come colonne e i relativi valori nel ResultSet per una carta specificata.Quindi idealmente avrei un set di risultati come:
ID NAME SPECIALTYPE
1 Red Dragon Archfiend Synchro
1 Red Dragon Archfiend DARK
1 Red Dragon Archfiend Effect
e potrei contare i miei risultati in questo modo.
Immagino che sarebbe ancora più astuto semplicemente concatenare le proprietà insieme in base alla loro parola chiave, in modo da poter generare un ResultSet come:
1 Red Dragon Archfiend Synchro/DARK/Effect
..ma non so se è fattibile.
Aiutami a stackoverflow Kenobi!Sei la mia unica speranza.
Soluzione
È questo per il server SQL?
Se sì allora
Concatena valori da più righe in una colonna (2000)
Concatena valori da più righe in una colonna ordinata (2005+)
Altri suggerimenti
Correlati ma i valori sono mantenuti in colonne separate e tu conosci i tuoi "tipi speciali" in anticipo:
Query SQL per confrontare le vendite di prodotti per mese
Altrimenti lo farei con il cursore in una procedura memorizzata o preformerei la trasformazione nel livello aziendale o di presentazione.
Stab su sql se conosci tutti i casi:
Select
ID,NAME
,Synchro+DARK+Effect -- add a some substring logic to trim any trailing /'s
from
(select
ID
,NAME
--may need to replace max() with min().
,MAX(CASE SPECIALTYPE WHEN "Synchro" THEN SPECIALTYPE +"/" ELSE "" END) Synchro
,MAX(CASE SPECIALTYPE WHEN "DARK" THEN SPECIALTYPE +"/" ELSE "" END) DARK
,MAX(CASE SPECIALTYPE WHEN "Effect" THEN SPECIALTYPE ELSE "" END) Effect
from
table
group by
ID
,NAME) sub1
Non comprimere per concatenazione per l'archiviazione dei record correlati nel database.Non sono esattamente le migliori pratiche.
Quella che stai descrivendo è una tabella pivot.Le tabelle pivot lo sono difficile.Suggerirei di evitarli se possibile.
Perché non leggere semplicemente le righe correlate ed elaborarle in memoria?Non sembra che spenderai troppi millisecondi per farlo...
Un'opzione è fare in modo che le proprietà abbiano un PropertyType, quindi:
table cards
integer ID | string name | ... (other properties common to all Cards)
table property_types
integer ID | string name | string format | ... (possibly validations)
table properties
integer ID | integer property_type_id | string name | string value
foreign key property_type_id references property_types.ID
table cards_properties
integer ID | integer card_id | integer property_id
foreign key card_id references cards.ID
foreign key property_id references propertiess.ID
In questo modo, quando desideri impostare un nuovo valore di proprietà, puoi convalidarlo in base al tipo.Un tipo potrebbe essere "SpecialType" con un'enumerazione di valori.
Ho un tipo/formato per la mia tabella delle proprietà, in questo modo so come eseguire il cast/valutare quando ho a che fare con un valore intero.Non ero sicuro se fosse pertinente a questo problema o meno.