Come faccio a cercare un & # 8220; Property Bag & # 8221; tabella in SQL?
-
19-08-2019 - |
Domanda
Ho un "bagaglio proprietà" di base " tabella che memorizza gli attributi relativi alla mia tabella principale "Card." Quindi, quando voglio iniziare a fare qualche ricerca avanzata di carte, posso fare qualcosa del genere:
SELECT dbo.Card.Id, dbo.Card.Name
FROM dbo.Card
INNER JOIN dbo.CardProperty ON dbo.CardProperty.IdCrd = dbo.Card.Id
WHERE dbo.CardProperty.IdPrp = 3 AND dbo.CardProperty.Value = 'Fiend'
INTERSECT
SELECT dbo.Card.Id, dbo.Card.Name
FROM dbo.Card
INNER JOIN dbo.CardProperty ON dbo.CardProperty.IdCrd = dbo.Card.Id
WHERE (dbo.CardProperty.IdPrp = 10 AND (dbo.CardProperty.Value = 'Wind' OR dbo.CardProperty.Value = 'Fire'))
Quello che devo fare è estrarre questa idea in una sorta di procedura memorizzata, in modo che idealmente possa passare un elenco di combinazioni proprietà / valore e ottenere i risultati della ricerca.
Inizialmente questo sarà un "rigoroso" ricerca, il che significa che i risultati devono corrispondere a tutti gli elementi nella query, ma mi piacerebbe anche avere una "libera" query in modo che corrisponda a tutti i risultati nella query.
Non riesco proprio a avvolgere la testa attorno a questo. La mia versione precedente di questo era di generare alcune enormi query SQL da eseguire con molte clausole AND / OR, ma spero di fare qualcosa di un po 'più elegante questa volta. Come posso fare per fare questo?
Soluzione
Mi sembra che tu abbia un EAV qui. se stai usando SQL Server 2005 e successivi ti suggerirei di usare il tipo di dati XML per questo:
http://weblogs.sqlteam.com/mladenp /archive/2006/10/14/14032.aspx
semplifica notevolmente la ricerca e le cose con le funzionalità di query XML integrate.
se non puoi cambiare il tuo modello, guarda questo: