Как мне найти таблицу «Property Bag» в SQL? - PullRequest
1 голос
/ 19 января 2009

У меня есть базовая таблица свойств, в которой хранятся атрибуты моей основной таблицы «Карта». Поэтому, когда я хочу начать продвинутый поиск карт, я могу сделать что-то вроде этого:

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'))

Что мне нужно сделать, это извлечь эту идею в какую-то хранимую процедуру, чтобы в идеале я мог передать список комбинаций свойство / значение и получить результаты поиска.

Изначально это будет «строгий» поиск, означающий, что результаты должны соответствовать всем элементам запроса, но я также хотел бы иметь «свободный» запрос, чтобы он соответствовал любому из результатов в запросе. запрос.

Я не могу обернуться вокруг этого. Моя предыдущая версия заключалась в том, чтобы сгенерировать какой-то массивный SQL-запрос для выполнения с большим количеством предложений AND / OR, но в этот раз я надеюсь сделать что-то более элегантное. Как мне это сделать?

1 Ответ

4 голосов
/ 19 января 2009

мне кажется, что у вас есть модель EAV . Если вы используете SQL Server 2005 и выше, я бы посоветовал использовать для этого тип данных XML:

http://weblogs.sqlteam.com/mladenp/archive/2006/10/14/14032.aspx

значительно упрощает поиск и прочее благодаря встроенным функциям запросов xml.

если вы не можете изменить свою модель, посмотрите на это:

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

...