用笛卡尔积重写查询

时间:2016-10-25 15:28:50

标签: tsql cartesian

我不是开发人员,因此在没有内部联接的情况下需要帮助重写此查询,因为我认为这是核心问题。这运行超过20秒。较小的块在一秒钟内运行。帮助。

select a.compID, b.InitialRT, b.VwRgts, b.UpdRgts, b.InsRgts, b.delRgts, b.Sscrnum , c.UserID
from tablecmpy a, tbldetrght b (nolock)
inner join tableuser c (nolock) on c.GroupID = b.UserId 
where b.RecType='G'  
and b.compID='[ALL]' 
and b.InitialRT+b.VwRgts+b.UpdRgts+b.InsRgts+b.delRgts > 0  

1 个答案:

答案 0 :(得分:0)

你已经在这里from tablecmpy a, tbldetrght b (nolock)获得了笛卡尔联盟(旧式联接)。尝试使用:

SELECT  a.compID, 
        b.InitialRT, 
        b.VwRgts, 
        b.UpdRgts, 
        b.InsRgts, 
        b.delRgts, 
        b.Sscrnum, 
        c.UserID
FROM tablecmpy a (nolock)
CROSS JOIN tbldetrght b (nolock)
INNER JOIN tableuser c (nolock) 
    ON c.GroupID = b.UserId 
WHERE b.RecType='G'  
    AND b.compID='[ALL]' 
    AND COALESCE(b.InitialRT,0) + 
        COALESCE(b.VwRgts,0) +
        COALESCE(b.UpdRgts,0) + 
        COALESCE(b.InsRgts,0) +
        COALESCE(b.delRgts,0) > 0 

我不知道NULL中是否有b.columns,所以我添加了COALESCE来处理它们。