2014-12-04 4 views
1

У меня есть таблицы Items, которые имеют следующие столбцы:Как правильно соединить таблицу, которая может вернуть более одной строки

Itemid || AdminUserID || ItemName

И я пытаюсь присоединиться к нему с ItemAttributes:

ItemAttributeId || ItemId || AttributeValue

, где один ItemId может иметь несколько значений ItemAttributeId.

Я создал процедуру для извлечения значений записи из двух таблиц:

SELECT 
    i.ItemID, 
    i.AdminUserID, 
    i.ItemName, 
    attr1.AttributeValue as IsForEmailRobotProcessingValue, 
    attr2.AttributeValue as RobotScheduledHoursValue -- HERE IS THE PROBLEM 
FROM [dbo].[Items] i WITH (NOLOCK) 
    LEFT JOIN [dbo].ItemAttributes attr1 WITH(NOLOCK) 
     ON attr1.ItemID = i.ItemID and attr1.ItemAttributeID = 1 
    LEFT JOIN [dbo].ItemAttributes attr2 WITH(NOLOCK) 
    ON attr2.ItemID = i.ItemID and attr2.ItemAttributeID = 2 
WHERE ((attr1.AttributeValue IS NOT NULL AND attr1.AttributeValue = 'true') OR 
    @OnlyForEmailRobotProcessing = 0) 
ORDER BY ItemName 

Что мне не нравится в том, что я LEFT JOIN в два раза один и тот же стола и создал разные псевдонимы для каждого соединения в соответствии с тем же ItemId. Есть ли лучший способ ЛЕВОЙ ВСТУПИТЬ только один раз и создал два разных псевдонима для каждого ItemAttributeId? Благодаря!

ответ

1

Попробуйте это:

SELECT 
    i.ItemID, 
    i.AdminUserID, 
    i.ItemName, 
    attr1.AttributeValue1 as IsForEmailRobotProcessingValue, 
    attr1.AttributeValue2 as RobotScheduledHoursValue 
FROM [dbo].[Items] i WITH (NOLOCK) 
    LEFT JOIN 
      (select ItemId, (select AttributeValue 
           from [dbo].ItemAttributes a 
           where a.ItemId = b.ItemId and a.ItemAttributeID = 1) as AttributeValue1, 
           (select AttributeValue 
           from [dbo].ItemAttributes c 
           where c.ItemId = b.ItemId and c.ItemAttributeID = 2) as AttributeValue2 
      from [dbo].ItemAttributes b WITH(NOLOCK) 
      where b.ItemId = i.ItemID and b.ItemAttributeID in (1,2) 

       ) attr1 on i.ItemId = attr1.ItemId 

WHERE ((attr1.AttributeValue IS NOT NULL AND attr1.AttributeValue = 'true') OR 
    @OnlyForEmailRobotProcessing = 0) 
ORDER BY ItemName 
+0

Спасибо за ваш ответ. Считаете ли вы, что это более эффективно, чем моя версия? –

+0

Вы должны проверить планы выполнения, чтобы измерить производительность. – Milen

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