您将隐式连接与显式连接混合在一起。这是允许的,但您需要了解如何正确执行此操作。
问题是,显式连接(使用JOIN
关键字)优先于隐式连接(“逗号”连接,其中连接条件在WHERE
条款)。
以下是您的查询的概要:
SELECT
…
FROM a, b LEFT JOIN dkcd ON …
WHERE …
您可能期望它的行为如下:
SELECT
…
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …
也就是表的组合a
and b
与表连接dkcd
。事实上,正在发生的事情是
SELECT
…
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …
也就是说,正如您可能已经理解的那样,dkcd
专门针对b
并且只有b
,然后将连接的结果与a
并进一步过滤WHERE
条款。在这种情况下,任何对a
in the ON
条款无效,a
目前尚不清楚。这就是您收到错误消息的原因。
如果我是你,我可能会尝试重写这个查询,一种可能的解决方案可能是:
SELECT DISTINCT
a.maxa,
b.mahuyen,
a.tenxa,
b.tenhuyen,
ISNULL(dkcd.tong, 0) AS tongdkcd
FROM phuongxa a
INNER JOIN quanhuyen b ON LEFT(a.maxa, 2) = b.mahuyen
LEFT OUTER JOIN (
SELECT
maxa,
COUNT(*) AS tong
FROM khaosat
WHERE CONVERT(datetime, ngaylap, 103) BETWEEN 'Sep 1 2011' AND 'Sep 5 2011'
GROUP BY maxa
) AS dkcd ON dkcd.maxa = a.maxa
WHERE a.maxa <> '99'
ORDER BY a.maxa
这里是表格a
and b
首先连接,然后将结果连接到dkcd
。基本上,这与您的查询相同,只是对其中一个连接使用不同的语法,这产生了很大的差异:参考a.maxa
in the dkcd
的加入条件现在绝对有效。
正如@Aaron Bertrand 正确指出的那样,您可能应该符合资格maxa
可能有一个特定的别名a
, 在里面ORDER BY
clause.