2013-08-24 3 views
0

Я попытался использовать сложные условия в подзапросе, но он не вернул ожидаемый результат. Можете ли вы посмотреть пример ниже, чтобы понять, почему запрос не работает?Sql server Несколько подзапросов условий

Table : 1 
EntityID StartDate EndDate 

121  2013-08-01 2013-08-31 
122  2013-08-01 2013-08-31 
123  2013-08-01 2013-08-31 


Table : 2 
EntityID  AttributeID AttributeValue 

121   41     304 
122   41     304 
123   41     304 
123   54     307  

Теперь я пытаюсь выборки на основе AttributeID и AttribueValue из таблицы-2 и Звездную и EndDate из table1, используя следующий запрос. (Пример: На 41 и 304, и 54, и 307 получили удовлетворены 123 только я хочу принести, что 123 только одна запись)

SELECT pe.EntityID 
FROM table1 pe   
WHERE pe.StartDate = '2013-08-01' 
     AND pe.EndDate = '2013-08-31' 
     AND pe.EntityID IN (SELECT peaiv.EntityID 
        FROM table2 peaiv 
        WHERE peaiv.AttributeID IN (41) 
          AND peaiv.[Value] IN (304) 
          AND peaiv.EntityID IN (SELECT peaiv.EntityID 
                FROM 
                  PT_EntityAttributesIntValues 
                  peaiv 
                WHERE peaiv.AttributeID IN (54) 
                  AND peaiv.[Value] IN (307)) 


EntitID 
-------- 
121 
122 
123 

Запрос возврата выше результат, но я ожидал результата только . Может ли кто-нибудь попробовать это.

+0

Является ли PT_EntityAttributesIntValues ​​table2? И является peaiv. [Value] должен быть peaiv. [AttributeValue]? –

+0

Итак, вы создали структуру базы данных EAV, и вы обнаружили, что запросы сложны и не возвращают ожидаемые результаты? Не могу сказать, что я удивлен. – podiluska

ответ

2
Declare @Table1 table(EntityID int, StartDate datetime, EndDate datetime) 
Insert into @Table1 
SELECT 121,'2013-08-01','2013-08-31' 
UNION SELECT 122,'2013-08-01','2013-08-31' 
UNION SELECT 123,'2013-08-01','2013-08-31' 

Declare @Table2 Table (EntityID int, AttributeID int , AttributeValue int) 
Insert into @Table2 
SELECT 121,41,304 
UNION SELECT 122,41,304 
UNION SELECT 123,41,304 
UNION SELECT 123,54,307 

SELECT EntityID FROM @Table1 pe 
WHERE 
pe.StartDate = '2013-08-01' AND pe.EndDate = '2013-08-31' 
AND EntityID in 
(SELECT EntityID from @Table2 
WHERE (AttributeID=41 and AttributeValue=304) 
) 
AND EntityID in 
(SELECT EntityID from @Table2 
WHERE (AttributeID=54 and AttributeValue=307) 
) 
2

Я хотел бы подойти к этому как запрос «в пределах наборов установленный», а затем присоединиться назад к таблице 1, чтобы заполнить эти детали:

select t1.* 
from table1 t1 join 
    (select EntityId 
     from table2 t2 
     group by EntityId 
     having sum(case when AttributeId = 41 and AttributeValue = 304 then 1 else 0 end) > 0 and 
      sum(case when AttributeId = 54 and AttributeValue = 307 then 1 else 0 end) > 0 
    ) t2 
    on t1.EntityId = t2.EntityId; 

Каждое условие в предложении having тестирует для одной пары значений в наборе строк, которые соответствуют, и сущности. Это упрощает добавление дополнительных условий.