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?

È stato utile?

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:

http://weblogs.sqlteam.com/davidm/articles/12117.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top