2014-11-07 5 views
0

Я пытаюсь выполнить запрос, но не может получить егоВыберите Лица, которые соответствуют всем критериям

Вот структура:

Person: 
    IdPerson 
    FirstName 
    LastName 
    ... 

CustomField 
    IdField 
    .... 

CustomFieldXPerson 
    IdField 
    IdPerson 
    Value 

Filter: 
    IdField 
    Value 
    Criteria (<, >, <=, >=, =) 
    GroupId 

Мне нужно, чтобы все лица, которые соответствуют со всеми фильтров, а также всех лиц, которые соответствуют, по крайней мере, одним ...

SELECT IdPerson 
FROM Person p 
    JOIN CustomFieldXPerson cfxp on cfxp.IdPerson = p.IdPerson 
    JOIN Filter f on f.IdField = cfxp.IdField AND f.Value (f.Criteria) cfxp.Value 
WHERE f.GroupId = X 

Есть простой способ сделать это динамически?

ответ

2

Вы можете выразить свой запрос как:

SELECT IdPerson 
FROM Person p JOIN 
    CustomFieldXPerson cfxp 
    on cfxp.IdPerson = p.IdPerson JOIN 
    Filter f 
    on f.IdField = cfxp.IdField AND 
     (f.Criteria = '=' and f.Value = cfxp.Value or 
     f.Criteria = '<' and f.Value < cfxp.Value or 
     f.Criteria = '<=' and f.Value <= cfxp.Value or 
     f.Criteria = '>' and f.Value > cfxp.Value or 
     f.Criteria = '>=' and f.Value >= cfxp.Value 
     )   
WHERE f.GroupId = X ; 

EDIT:

Если вы хотите, чтобы лица, которые соответствуют все фильтры, просто использовать group by:

SELECT IdPerson 
FROM Person p JOIN 
    CustomFieldXPerson cfxp 
    on cfxp.IdPerson = p.IdPerson LEFT JOIN 
    Filter f 
    on f.IdField = cfxp.IdField AND 
     (f.Criteria = '=' and f.Value = cfxp.Value or 
     f.Criteria = '<' and f.Value < cfxp.Value or 
     f.Criteria = '<=' and f.Value <= cfxp.Value or 
     f.Criteria = '>' and f.Value > cfxp.Value or 
     f.Criteria = '>=' and f.Value >= cfxp.Value 
     ) AND  
     f.GroupId = X 
GROUP BY idPerson 
HAVING COUNT(f.IdField) = COUNT(*) OR COUNT(f.IdField) = 0; 

Другими словами, все фильтры, которые соответствуют человеку, в группе, соответствуют. Дополнительное условие в предложении HAVING заключается в том, что в группе фильтров нет фильтров.

+0

Спасибо, Гордон, это поможет мне получить всех лиц, которые соответствуют хотя бы одному. Вы знаете, как получить всех людей, которые соответствуют всем фильтрам? –

+0

Спасибо, Гордон !!! –

Смежные вопросы