Запрос TSQL для поиска строк, соответствующих набору свойств

У меня есть следующая упрощенная схема:

CREATE TABLE [file]
( 
    id UNIQUEIDENTIFIER NOT NULL, 
    uri NVARCHAR(MAX) NOT NULL, 
    CONSTRAINT PK_file PRIMARY KEY (id ASC) ON [PRIMARY] 
)

CREATE TABLE [property]
( 
    id UNIQUEIDENTIFIER NOT NULL, 
    name NVARCHAR(MAX) NOT NULL, 
    CONSTRAINT PK_property PRIMARY KEY (id ASC) ON [PRIMARY] 
)

CREATE TABLE [metadata]
( 
    fileid UNIQUEIDENTIFIER NOT NULL,
    propertyid UNIQUEIDENTIFIER NOT NULL,
    value NVARCHAR(MAX) NOT NULL, 
    CONSTRAINT PK_metadata PRIMARY KEY (fileid, propertyid ASC) ON [PRIMARY] 
)

Где [fileid ] FK для [файл]. [Id] и [propertyid] FK для [property]. [Id] . Предположим, что [Properyid] - это КЛАСТЕРИРОВАННЫЙ , а [value] - это НЕКЛАСТЕРНЫЙ .

Я хочу выбрать все из файлы, соответствующие определенному набору метаданных; например, каждый файл с парой значений свойства size = 1 КБ и extension = 'txt' .

Запрос, который я придумал, например, с указаны три свойства:

SELECT [uri] FROM [file] WHERE [id] IN (
    SELECT a.[fileid] FROM (
        SELECT COUNT(*) [count], [fileid] FROM [metadata]
        WHERE ([propertyid] = '597ddddf-afd2-414f-9774-36f067038064' AND 
                [value] = N'moo') OR
              ([propertyid] = 'd83d12de-e4bc-4d18-be12-743504df3318' AND 
                [value] = N'foo') OR
              ([propertyid] = 'c00c3966-5034-4818-8567-abd660f37f15' AND 
                [value] = N'boo')
        GROUP BY [fileid]
    ) a
    WHERE a.[count] = 3
)

Могу я сделать что-нибудь лучше?

5
задан abatishchev 22 April 2011 в 08:58
поделиться