使用同一张表进行多个左联接是否更好,更快?

时间:2018-08-02 20:01:46

标签: sql sql-server join left-join

SELECT
    E.Id, 
    E.Name, 
    CASE EL.Application_Level WHEN 33 then 1 ELSE 0 END As MyDisplayName,
    CASE EL1.Application_Level WHEN 34 then 1 ELSE 0 END As FoodTag
FROM
    Entity E 
    INNER JOIN dbo.Countries CN ON cn.id=E.COUNTRY_ID  
    LEFT JOIN dbo.Entity_Levels EL ON E.ID = EL.Entity_ID AND EL.Application_Level = 33
    LEFT JOIN dbo.Entity_Levels EL1 ON E.ID = EL1.Entity_ID AND EL1.Application_Level = 34

我不想使用同一个表的两个联接,因为将添加更多的应用程序级别,并且我不想添加更多的联接。

无论如何,我是否可以使用或限定条件并进行一个联接并将多条记录合并为一条记录。

2 个答案:

答案 0 :(得分:0)

由于您没有显示任何示例数据,所以这只是一个猜测,但是看起来您只需1次连接到ENTITY_LEVELS表就可以执行以下操作:

SELECT
E.Id, 
max(E.Name) as Name,
max(case when EL.application_level = 33 then 1 else 0 end) as MyDisplayName,
max(case when EL.application_level = 34 then 1 else 0 end) as FoodTag,
max(case when EL.application_level = 35 then 1 else 0 end) as RandomOtherThing
from entity E
INNER JOIN dbo.Countries CN ON cn.id=E.COUNTRY_ID  
LEFT JOIN dbo.Entity_Levels EL ON E.ID = EL.Entity_ID 
group by E.Id

答案 1 :(得分:-1)

SELECT E.Id
    ,E.Name
    ,CASE WHEN EL.Application_Level = 33
             THEN 1
         ELSE 0
     END AS MyDisplayName
    ,CASE WHEN EL.Application_Level = 34
            THEN 1
         ELSE 0
     END AS FoodTag
FROM Entity E WITH(NOLOCK) 
INNER JOIN dbo.Countries CN WITH(NOLOCK) ON CN.id=E.COUNTRY_ID
LEFT JOIN dbo.Entity_Levels EL WITH(NOLOCK) ON E.ID=EL.Entity_ID