Join 如何解决SQL中不明确的列名错误
我正在使用以下查询并获得错误,“不明确的列名'area'。我做了一些阅读,发现在CTE中有它而不是group by/order by是错误的原因。我的情况似乎不是这样。此查询的最终结果应显示如下内容。关于我需要在哪里加/减一个面积的问题,有什么想法吗 为了提供一些上下文,某些元素的原因是,即使没有数据,结果集也包含一个预先确定的SizeClass列表。有些地区没有数据。650人的人口不包括某些行业。此外,xyzfirms201701中有29列。区域、SizeClass、所有权和NAICCode只是其中包含的一些字段 数据是保密的,因此遗憾的是,无法提供任何数据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只
;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有什么意义。我将很快添加可选的替代查询。您是否尝试删除交叉联接?注:由于没有数据可供测试,我所能做的就是“最佳猜测”删除整行内容,而不仅仅是