Join 如何解决SQL中不明确的列名错误

Join 如何解决SQL中不明确的列名错误,join,ssms,common-table-expression,ambiguous,Join,Ssms,Common Table Expression,Ambiguous,我正在使用以下查询并获得错误,“不明确的列名'area'。我做了一些阅读,发现在CTE中有它而不是group by/order by是错误的原因。我的情况似乎不是这样。此查询的最终结果应显示如下内容。关于我需要在哪里加/减一个面积的问题,有什么想法吗 为了提供一些上下文,某些元素的原因是,即使没有数据,结果集也包含一个预先确定的SizeClass列表。有些地区没有数据。650人的人口不包括某些行业。此外,xyzfirms201701中有29列。区域、SizeClass、所有权和NAICCode只

我正在使用以下查询并获得错误,“不明确的列名'area'。我做了一些阅读,发现在CTE中有它而不是group by/order by是错误的原因。我的情况似乎不是这样。此查询的最终结果应显示如下内容。关于我需要在哪里加/减一个面积的问题,有什么想法吗

为了提供一些上下文,某些元素的原因是,即使没有数据,结果集也包含一个预先确定的SizeClass列表。有些地区没有数据。650人的人口不包括某些行业。此外,xyzfirms201701中有29列。区域、SizeClass、所有权和NAICCode只是其中包含的一些字段

数据是保密的,因此遗憾的是,无法提供任何数据

;with sizeclasseptable as 
(
select area,ownership,sizeclassep from (
select '01' as sizeclassep, '50' as ownership, area='000003'
union select '02' as sizeclassep, '50' as ownership, area='000003'
union select '03' as sizeclassep, '50' as ownership, area='000003'
union select '04' as sizeclassep, '50' as ownership, area='000003'
union select '05' as sizeclassep, '50' as ownership, area='000003'
union select '06' as sizeclassep, '50' as ownership, area='000003'
union select '07' as sizeclassep, '50' as ownership, area='000003'
union select '08' as sizeclassep, '50' as ownership, area='000003'
union select '09' as sizeclassep, '50' as ownership, area='000003') t0
cross join ( select distinct area from xyzfirms201701 ) t1
)

SELECT
'000003' AS area,
t2.[SizeClassep],
COUNT(*) AS [Number of Worksites],
SUM(t2.Employment) AS [Employment In Size Class]
 from sizeclasseptable
 inner join xyzfirms201701 t2 
on t2.area=sizeclasseptable.area 
and t2.ownership=sizeclasseptable.ownership
and t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
t2.area, t2.SizeClassep
ORDER BY
t2.area, t2.SizeClassep


area    SizeClassep Number of Worksites Employment In Size Class
000003  01  10866   13138
000003  02  1275    8322
000003  03  831 11192
000003  04  492 14694
000003  05  116 7783
000003  06  61  8876
000003  07  8   2809
000003  08  11  7909
000003  09  3   5322

在联合体
区域='000003'
中都有[area],在
从xyzfirms201701中选择不同区域中也有[area]。你到底想用哪一个作为“区域”?假设您在最终结果中似乎只想要
'000003'
,则使用
t0.area
(请参见下面第二行)

如果您在cte中使用交叉连接,我假定您希望返回所有行,因此请使用左连接而不是内部连接(?注意,我猜是这样)

您当前正在按t2.area分组,但不包括在select子句中。将其从分组中省略或包含在select子句中。注意,因为[area]是连接的一部分,所以它只能是您输入CTE的任何值,因此我建议您使用
SizeClassable.area

;with sizeclasseptable as (
    select t0.area,ownership,sizeclassep 
    from (
                  select '01' as sizeclassep, '50' as ownership, area='000003'
        union all select '02' as sizeclassep, '50' as ownership, area='000003'
        union all select '03' as sizeclassep, '50' as ownership, area='000003'
        union all select '04' as sizeclassep, '50' as ownership, area='000003'
        union all select '05' as sizeclassep, '50' as ownership, area='000003'
        union all select '06' as sizeclassep, '50' as ownership, area='000003'
        union all select '07' as sizeclassep, '50' as ownership, area='000003'
        union all select '08' as sizeclassep, '50' as ownership, area='000003'
        union all select '09' as sizeclassep, '50' as ownership, area='000003'
        ) t0
    /* cross join ( select distinct area from xyzfirms201701 ) t1 */
    )

SELECT
    sizeclasseptable.area  AS [area]
  , t2.SizeClassep
  , COUNT(*)               AS [Number of Worksites]
  , SUM(t2.Employment)     AS [Employment In Size Class]
FROM sizeclasseptable
LEFT JOIN xyzfirms201701 t2 ON t2.area = sizeclasseptable.area
    AND t2.ownership = sizeclasseptable.ownership
    AND t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
    sizeclasseptable.area
  , t2.SizeClassep
ORDER BY
    sizeclasseptable.area
  , t2.SizeClassep

编辑

另一种办法:

DECLARE @ownership varchar(20) = '50'
DECLARE @area varchare(20) = '000003'

WITH sizeclasseptable
AS (
    SELECT
        sizeclassep
    FROM (
                  select '01' as sizeclassep
        union all select '02' as sizeclassep
        union all select '03' as sizeclassep
        union all select '04' as sizeclassep
        union all select '05' as sizeclassep
        union all select '06' as sizeclassep
        union all select '07' as sizeclassep
        union all select '08' as sizeclassep
        union all select '09' as sizeclassep
    ) t0
)

SELECT
    t2.area
  , t2.SizeClassep
  , COUNT(*)           AS [Number of Worksites]
  , SUM(t2.Employment) AS [Employment In Size Class]
FROM sizeclasseptable
LEFT JOIN xyzfirms201701 t2 ON t2.area = @area
AND t2.ownership = @ownership
AND t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
    t2.area
  , t2.SizeClassep
ORDER BY
    t2.area
  , t2.SizeClassep
编辑2

减少查询迭代次数的一种方法可能是将分组扩展到用于选择该数据的所有3列,并拓宽where子句的定义方式。通过使用

SELECT
    t2.area
  , t2.SizeClassep
  , t2.ownership
  , COUNT(*)           AS [Number of Worksites]
  , SUM(t2.Employment) AS [Employment In Size Class]
FROM (
    SELECT
        sizeclassep
    FROM (
    VALUES ('01'), ('01'), ('03'), ('04'), ('05'), ('06'), ('07'), ('08'), ('09')
    ) t0 (sizeclassep)
) sizeclasseptable
LEFT JOIN xyzfirms201701 t2 ON t2.sizeclassep = sizeclasseptable.sizeclassep
AND t2.area IN ('0003','0004','0005','0006')  /* ALTER THE LIST TO SUIT YOUR NEEDS */
AND t2.ownership IN ('50','60','70')          /* ALTER THE LIST TO SUIT YOUR NEEDS */
AND 
GROUP BY
    t2.area
  , t2.SizeClassep
  , t2.ownership
ORDER BY
    t2.area
  , t2.SizeClassep
  , t2.ownership

在联合体
区域='000003'
中都有[area],在
从xyzfirms201701中选择不同区域中也有[area]。你到底想用哪一个作为“区域”?假设您在最终结果中似乎只想要
'000003'
,则使用
t0.area
(请参见下面第二行)

如果您在cte中使用交叉连接,我假定您希望返回所有行,因此请使用左连接而不是内部连接(?注意,我猜是这样)

您当前正在按t2.area分组,但不包括在select子句中。将其从分组中省略或包含在select子句中。注意,因为[area]是连接的一部分,所以它只能是您输入CTE的任何值,因此我建议您使用
SizeClassable.area

;with sizeclasseptable as (
    select t0.area,ownership,sizeclassep 
    from (
                  select '01' as sizeclassep, '50' as ownership, area='000003'
        union all select '02' as sizeclassep, '50' as ownership, area='000003'
        union all select '03' as sizeclassep, '50' as ownership, area='000003'
        union all select '04' as sizeclassep, '50' as ownership, area='000003'
        union all select '05' as sizeclassep, '50' as ownership, area='000003'
        union all select '06' as sizeclassep, '50' as ownership, area='000003'
        union all select '07' as sizeclassep, '50' as ownership, area='000003'
        union all select '08' as sizeclassep, '50' as ownership, area='000003'
        union all select '09' as sizeclassep, '50' as ownership, area='000003'
        ) t0
    /* cross join ( select distinct area from xyzfirms201701 ) t1 */
    )

SELECT
    sizeclasseptable.area  AS [area]
  , t2.SizeClassep
  , COUNT(*)               AS [Number of Worksites]
  , SUM(t2.Employment)     AS [Employment In Size Class]
FROM sizeclasseptable
LEFT JOIN xyzfirms201701 t2 ON t2.area = sizeclasseptable.area
    AND t2.ownership = sizeclasseptable.ownership
    AND t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
    sizeclasseptable.area
  , t2.SizeClassep
ORDER BY
    sizeclasseptable.area
  , t2.SizeClassep

编辑

另一种办法:

DECLARE @ownership varchar(20) = '50'
DECLARE @area varchare(20) = '000003'

WITH sizeclasseptable
AS (
    SELECT
        sizeclassep
    FROM (
                  select '01' as sizeclassep
        union all select '02' as sizeclassep
        union all select '03' as sizeclassep
        union all select '04' as sizeclassep
        union all select '05' as sizeclassep
        union all select '06' as sizeclassep
        union all select '07' as sizeclassep
        union all select '08' as sizeclassep
        union all select '09' as sizeclassep
    ) t0
)

SELECT
    t2.area
  , t2.SizeClassep
  , COUNT(*)           AS [Number of Worksites]
  , SUM(t2.Employment) AS [Employment In Size Class]
FROM sizeclasseptable
LEFT JOIN xyzfirms201701 t2 ON t2.area = @area
AND t2.ownership = @ownership
AND t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
    t2.area
  , t2.SizeClassep
ORDER BY
    t2.area
  , t2.SizeClassep
编辑2

减少查询迭代次数的一种方法可能是将分组扩展到用于选择该数据的所有3列,并拓宽where子句的定义方式。通过使用

SELECT
    t2.area
  , t2.SizeClassep
  , t2.ownership
  , COUNT(*)           AS [Number of Worksites]
  , SUM(t2.Employment) AS [Employment In Size Class]
FROM (
    SELECT
        sizeclassep
    FROM (
    VALUES ('01'), ('01'), ('03'), ('04'), ('05'), ('06'), ('07'), ('08'), ('09')
    ) t0 (sizeclassep)
) sizeclasseptable
LEFT JOIN xyzfirms201701 t2 ON t2.sizeclassep = sizeclasseptable.sizeclassep
AND t2.area IN ('0003','0004','0005','0006')  /* ALTER THE LIST TO SUIT YOUR NEEDS */
AND t2.ownership IN ('50','60','70')          /* ALTER THE LIST TO SUIT YOUR NEEDS */
AND 
GROUP BY
    t2.area
  , t2.SizeClassep
  , t2.ownership
ORDER BY
    t2.area
  , t2.SizeClassep
  , t2.ownership

cte中的列名与xyzfirms201701中的列名相同。您必须在任何一个表中重命名它,此查询才能工作。或者,您可以只创建别名列名,如下所示。但是,当您不需要该表中的任何列时,交叉连接在这里就没有意义了。它只会创建重复的记录

以下几点应该行得通。请注意“面积”列的a1别名

;with sizeclasseptable as 
(
select area,ownership,sizeclassep from (
select '01' as sizeclassep, '50' as ownership, area='000003'
union select '02' as sizeclassep, '50' as ownership, area='000003'
union select '03' as sizeclassep, '50' as ownership, area='000003'
union select '04' as sizeclassep, '50' as ownership, area='000003'
union select '05' as sizeclassep, '50' as ownership, area='000003'
union select '06' as sizeclassep, '50' as ownership, area='000003'
union select '07' as sizeclassep, '50' as ownership, area='000003'
union select '08' as sizeclassep, '50' as ownership, area='000003'
union select '09' as sizeclassep, '50' as ownership, area='000003') t0
cross join ( select distinct area a1 from xyzfirms201701 ) t1
)

SELECT
'000003' AS area,
t2.[SizeClassep],
COUNT(*) AS [Number of Worksites],
SUM(t2.Employment) AS [Employment In Size Class]
 from sizeclasseptable
 inner join xyzfirms201701 t2 
on t2.area=sizeclasseptable.area 
and t2.ownership=sizeclasseptable.ownership
and t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
t2.area, t2.SizeClassep
ORDER BY
t2.area, t2.SizeClassep

cte中的列名与xyzfirms201701中的列名相同。您必须在任何一个表中重命名它,此查询才能工作。或者,您可以只创建别名列名,如下所示。但是,当您不需要该表中的任何列时,交叉连接在这里就没有意义了。它只会创建重复的记录

以下几点应该行得通。请注意“面积”列的a1别名

;with sizeclasseptable as 
(
select area,ownership,sizeclassep from (
select '01' as sizeclassep, '50' as ownership, area='000003'
union select '02' as sizeclassep, '50' as ownership, area='000003'
union select '03' as sizeclassep, '50' as ownership, area='000003'
union select '04' as sizeclassep, '50' as ownership, area='000003'
union select '05' as sizeclassep, '50' as ownership, area='000003'
union select '06' as sizeclassep, '50' as ownership, area='000003'
union select '07' as sizeclassep, '50' as ownership, area='000003'
union select '08' as sizeclassep, '50' as ownership, area='000003'
union select '09' as sizeclassep, '50' as ownership, area='000003') t0
cross join ( select distinct area a1 from xyzfirms201701 ) t1
)

SELECT
'000003' AS area,
t2.[SizeClassep],
COUNT(*) AS [Number of Worksites],
SUM(t2.Employment) AS [Employment In Size Class]
 from sizeclasseptable
 inner join xyzfirms201701 t2 
on t2.area=sizeclasseptable.area 
and t2.ownership=sizeclasseptable.ownership
and t2.sizeclassep = sizeclasseptable.sizeclassep
GROUP BY
t2.area, t2.SizeClassep
ORDER BY
t2.area, t2.SizeClassep

为什么需要交叉连接(t1)而不使用其中的任何列?它将创建重复的记录。问题是:t0和t1具有相同的列名“area”。如果在t0中重命名区域列,它应该可以正常工作。@Noor,那么我会将其从区域更改为区域x吗?如果是,则表示列名无效。此外,我将很快对其进行编辑以提供一些上下文。虽然我已经给出了一个答案,但我不知道为什么要基于[area]和一个常数值(也称为[area])形成交叉联接。看起来很奇怪me@Calflamesfann我添加了我的建议作为答案。为什么您需要交叉连接(t1)您没有使用其中的任何列?它将创建重复的记录。问题是:t0和t1具有相同的列名“area”。如果在t0中重命名区域列,它应该可以正常工作。@Noor,那么我会将其从区域更改为区域x吗?如果是,则表示列名无效。此外,我将很快对其进行编辑以提供一些上下文。虽然我已经给出了一个答案,但我不知道为什么要基于[area]和一个常数值(也称为[area])形成交叉联接。看起来很奇怪me@Calflamesfann我添加了我的建议作为答案。您是否尝试删除交叉连接?注意:由于没有数据可供测试,我所能做的就是“最佳猜测”删除整行而不仅仅是两个单词。如果您现在查看代码,除了交叉连接之前/之后的
/*
*/
之外,它完全相同。研究交叉连接的作用(它使行相乘)看看这个。来自10个源行。我使用单个交叉连接得到100。400次迭代?我想你可能需要问更多的问题,也许有更简单的方法来实现你的目标。老实说,我不认为你现在使用的CTE有什么意义。我将很快添加可选的替代查询。您是否尝试删除交叉联接?注:由于没有数据可供测试,我所能做的就是“最佳猜测”删除整行内容,而不仅仅是