我在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;
答案 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个匹配时,存在细微的差异。我怀疑这会对你想要的结果产生影响。