Здравствуйте, StephenVLG, Вы писали:
Вариант с избавлением от многих join'ов:
CREATE TABLE [dbo].[FieldData](
[ItemId] [int] NOT NULL,
[FieldID] [int] NOT NULL,
[FieldValue] [varchar](100) NOT NULL,
CONSTRAINT [PK_FieldData] PRIMARY KEY CLUSTERED
(
[ItemId] ASC,
[FieldID] ASC
)
)
CREATE TABLE [dbo].[FieldQuery](
[QueryID] [int] NOT NULL,
[FieldID] [int] NOT NULL,
[FieldValue] [varchar](100) NOT NULL,
CONSTRAINT [PK_FieldQuery] PRIMARY KEY CLUSTERED
(
[QueryID] ASC,
[FieldID] ASC
)
)
Запрос (критерии добавляются в табличку FieldQuery):
select
top 500
d.ItemId
from
FieldData d
join FieldQuery q on q.fieldid = d.fieldid and d.fieldvalue = q.fieldvalue
Where
q.QueryId = 1
group by
d.ItemId
having
count(*) = (select count(*) from FieldQuery where QueryId = 1)
1. Как это будет работать на больших объемах -- не знаю, надо проверять и играть с индексами (в т.ч. clustered/non clustered).
2. Работает как условие И
3. Проверяет четкое сравнение
На больших объемах данных и большом количестве полей для поиска, join может оказаться лучше, чем вариант c OR предложенный MatFiz
здесьАвтор: MatFiz
Дата: 14.01.06
. Надо проверять...