大查询:如果没有一个条件,即连接两边的字段相等,则不能使用左外连接

xmd2e60i  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(211)

我正在用bq编写一个与我的源系统相同的逻辑。在源sql服务器端,它运行良好。但在大查询中,在最后一个左外连接条件中使用or条件失败。如果我移动where子句中的or条件,它将给出错误的计数。需要帮助解决此问题。如何重新编写下面的查询?
选择计数(*)

FROM    stprof PRO
                    INNER JOIN stdim DIM 
                        ON (DIM.diSet = PRO.diSet)
                    INNER JOIN DQConfig CFG 
                        ON (CFG.ConSet = PRO.ConSet)
                    LEFT OUTER JOIN AgSt CCT 
                        ON (CCT.StSet = PRO.StSet)

                    INNER JOIN stprof SummPRO 
                        ON (SummPRO.diSet = DIM.SummdiSet AND
                                                        SummPRO.dIntervalStart = PRO.dIntervalStart AND
                                                        SummPRO.SiteId = PRO.SiteId AND
                                                        SummPRO.nDuration = PRO.nDuration)
                    LEFT OUTER JOIN AgSt SummCCT 
                        ON (SummCCT.StSet = SummPRO.StSet)
                LEFT OUTER JOIN AgentStatus SummSTS 
                        ON (
                    SummSTS.StSet = SummPRO.StSet
                        OR
                            SummSTS.StSet = PRO.StSet)
            WHERE   DIM.cType = 'A'
wljmcqd8

wljmcqd81#

您可以用交叉连接替换左连接,并将条件从on子句移动到where子句,如下例所示


# standardSQL

SELECT COUNT(*)
FROM stprof PRO
INNER JOIN stdim DIM 
  ON DIM.diSet = PRO.diSet
INNER JOIN DQConfig CFG 
  ON CFG.ConSet = PRO.ConSet
LEFT OUTER JOIN AgSt CCT 
  ON CCT.StSet = PRO.StSet
INNER JOIN stprof SummPRO 
  ON SummPRO.diSet = DIM.SummdiSet 
  AND SummPRO.dIntervalStart = PRO.dIntervalStart 
  AND SummPRO.SiteId = PRO.SiteId 
  AND SummPRO.nDuration = PRO.nDuration
LEFT OUTER JOIN AgSt SummCCT 
  ON SummCCT.StSet = SummPRO.StSet
CROSS JOIN AgentStatus SummSTS 
WHERE DIM.cType = 'A' 
AND (
  SummSTS.StSet = SummPRO.StSet
  OR SummSTS.StSet = PRO.StSet
)

相关问题