2014-12-04 21 views
1

我有有下列的表項目:如何正確連接表可能返回多行

項目Id || 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 

我不喜歡這裏,我左連接在同一個表兩次,會爲每個不同的別名,聯接根據相同項目Id。有沒有更好的方法來只加入一次,併爲每個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

謝謝您的回答。你認爲這比我的版本更有效嗎? – 2014-12-04 11:43:36

+0

您必須檢查執行計劃才能測量性能。 – Milen 2014-12-04 11:45:56

相關問題