如果你不需要显示null,那就inner join,如果要就left join,4个表如果索引合理、where条件高效的话不会很慢的

解决方案 »

  1.   

    你 的表设计 决定了。。LEFT 吧。BCD每个表得两次。
      

  2.   

    把你的语句写出来,然后ctrl+M,再运行你的语句,贴执行计划看看
      

  3.   

    left join木有什么问题,关键是关联的字段上应有索引.
      

  4.   

    如果引入一个临时表
    将A表的数据转成如下结构
    #A
    id parentid categoryid nodeid deviceid有没有办法优化呢?
      

  5.   

    临时表在你这里会引入额外的insert和索引方面的开销,性能不见得一定有提升
      

  6.   


    我是这么写的 SELECT  
    ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS RowIndex,
    ria.ParentCategoryID AS ParentCategoryID, cc.Name as ParentCategory,
    ria.ParentNodeID AS ParentNodeID, st.Name as ParentNode,
    ria.ParentDeviceID AS ParentDeviceID, am.Name as ParentDevice,
    ria.ChildCategoryID AS ChildCategoryID,cc2.Name as ChildCategory,
    ria.ChildNodeID AS ChildNodeID,st2.Name as ChildNode,
    ria.ChildDeviceID  AS ChildDeviceID,am2.Name as ChildDevice
    FROM dbo.A as ria
    left join dbo.B as cc
    on ria.ParentCategoryID = cc.CategoryID
    left join dbo.B as cc2
    on ria.ChildCategoryID = cc2.CategoryID
    left join dbo.C as st
    on ria.ParentNodeID = st.NodeID
    left join dbo.C as st2
    on ria.ChildNodeID = st2.NodeID
    left join dbo.D as am
    on ria.ParentDeviceID = am.DeviceID
    left join dbo.D as am2
    on ria.ChildDeviceID = am.DeviceID

    CTRL-M 查看execution plan都落在了clustered index上。目前测试数据较少,性能不是啥问题。我没有什么sql背景,猛然看到这么多的left join,总有种refactor的冲动
      

  7.   

    数据量少的话参考价值没多大用处,你的语句如果可以适当加一些有效的WHERE条件,基本上就没什么问题了
      

  8.   

    针对你8楼的语句,索引建议是在on条件的列上加上非聚集索引。select中的列可以和这些on条件的索引组合成复合索引