我也看到过类似的错误,但我没有找到解决问题的方法.

SELECT DISTINCT
        a.maxa ,
        b.mahuyen ,
        a.tenxa ,
        b.tenhuyen ,
        ISNULL(dkcd.tong, 0) AS tongdkcd
FROM    phuongxa a ,
        quanhuyen b
        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'
        AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;

执行此查询时,错误结果是:

SELECT DISTINCT
        a.maxa ,
        b.mahuyen ,
        a.tenxa ,
        b.tenhuyen
FROM    phuongxa a ,
        quanhuyen b
WHERE   a.maxa <> '99'
        AND LEFT(a.maxa, 2) = b.mahuyen
ORDER BY maxa;

SELECT  maxa ,
        COUNT(*) AS tong
FROM    khaosat
WHERE   CONVERT(DATETIME, ngaylap, 103) BETWEEN 'Sep 1 2011'
                                        AND     'Sep 5 2011'
GROUP BY maxa;

推荐答案

您正在混合隐式连接和显式连接.这是允许的,但你需要知道如何正确地做到这一点.

问题是,显式连接(使用JOIN关键字实现的连接)优先于隐式连接(逗号连接,连接条件在WHERE子句中指定).

以下是您的查询概要:

SELECT
  …
FROM a, b LEFT JOIN dkcd ON …
WHERE …

你可能希望它的行为是这样的:

SELECT
  …
FROM (a, b) LEFT JOIN dkcd ON …
WHERE …

也就是说,表ab的组合与表dkcd相连.事实上,正在发生的是

SELECT
  …
FROM a, (b LEFT JOIN dkcd ON …)
WHERE …

也就是说,正如您可能已经理解的那样,dkcd专门针对b进行连接,并且只有b,然后连接的结果与a结合,并使用WHERE子句进行进一步过滤.在这种情况下,ON条款中对a的任何提及都是无效的,此时a是未知的.这就是您收到错误消息的原因.

如果我是你,我可能会try 重写这个查询,一个可能的解决方案可能是:

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

这里先将表ab合并,然后将结果合并到dkcd.基本上,这是与您的查询相同的查询,只是对其中一个连接使用了不同的语法,这造成了很大的不同:dkcd的连接条件中的引用a.maxa现在是绝对有效的.

正如@Aaron Bertrand正确指出的,在ORDER BY条款中,你可能应该用一个特定的别名来限定maxa,可能是a.

Sql相关问答推荐

神秘的日期转换

获取每5分钟时间间隔的总和

如何在幂函数中正确使用Power()和Exp()

Android房间fts4匹配语法AND OR

在数据库中搜索列

PostgreSQL抽奖查询

过go 四周未填充的数据,即W50,51,52-SQL

正在try 从SQL获取最新的ID和一个唯一名称

根据开始日期和结束日期的差异计算每天的计费

基于是否具有某些数据的关联表覆盖SELECT语句中的列值

如何根据行状态设置正确的标志

将最近的结束日期与开始日期相匹配

Clickhouse:左连接表到外部数组

try 将多行折叠为单个结果

在 MS Access VBA 中,如何测量显示查询的时间?

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

Select 多年的日期范围

基于源表的 SQL INSERT、UPDATE 和 DELETE

在给定列中具有特定值的行与 SQL 中的总行数的比率

PlSql 陷入死循环