在哪里和右/左加入

时间:2017-11-14 11:50:19

标签: sql sql-server

我在SQL Server中有以下代码,当我在INNER JOIN条件下使用我的过滤器时,右连接工作正常,但如果我改变它的位置并创建一个地方,它停止工作,我的问题是每一个我使用RIGHT或LEFT JOIN的时间我不能使用WHERE

SELECT pcm.clacta,
       pcm.descta,
       pcm.ctared,
       SUM(mcp.vlrliq)
  FROM e501tcp tcp 
 INNER JOIN e501mcp mcp ON mcp.codemp = tcp.codemp
                       AND mcp.codfil = tcp.codfil
                       AND mcp.numtit = tcp.numtit
                       AND mcp.codtpt = tcp.codtpt
                       AND mcp.codfor = tcp.codfor 
 RIGHT JOIN (SELECT pcm.clacta,
                    pcm.descta,
                    pcm.ctared
               FROM e043pcm pcm 
              WHERE pcm.codmpc = 700) pcm ON pcm.ctared = tcp.ctafin    
 WHERE tcp.codfil = 1
   AND tcp.numtit = '1/01' 
 GROUP BY pcm.clacta,
          pcm.descta,
          pcm.ctared
 ORDER BY pcm.clacta;

1 个答案:

答案 0 :(得分:1)

我不是RIGHT JOIN的粉丝。我认为LEFT JOIN更清晰(将所有内容保留在第一个表中,而不是最后一个表中)。无论如何,您的问题是WHERE子句正在撤消RIGHT JOIN

我会把它写成:

SELECT pcm.clacta,
       pcm.descta,
       pcm.ctared,
       SUM(mcp.vlrliq)
FROM e043pcm pcm LEFT JOIN
     e501tcp tcp 
     ON pcm.ctared = tcp.ctafin AND
        tcp.codfil = 1 AND
        tcp.numtit = '1/01' LEFT JOIN
     e501mcp mcp
     ON mcp.codemp = tcp.codemp AND
        mcp.codfil = tcp.codfil AND
        mcp.numtit = tcp.numtit AND
        mcp.codtpt = tcp.codtpt AND
        mcp.codfor = tcp.codfor 
 WHERE pcm.codmpc = 700
 GROUP BY pcm.clacta, pcm.descta, pcm.ctared
 ORDER BY pcm.clacta;

注意:

  • pcm上的条件可以在WHERE子句中。
  • pcm
  • 不需要子查询
  • 原始WHERE条件现在位于ON子句中。
  • JOIN s的顺序被切换,第二个条件切换为LEFT JOIN

此外,此逻辑与您的完全相同。当3个表中的2个匹配时,存在细微的差异。我怀疑这会对你想要的结果产生影响。