当我执行以下查询时:
SELECT DISTINCT
dat.FiscalYear,
dat.MonthName As FiscalMonth,
dat.FiscalQuarter,
dat.FiscalSemester,
a.m AS m,
o.oName AS o,
o.Calculation,
o.oDispOrder ,
o.oGrpId
FROM
[V].[dbo].[DimDate] dat
CROSS JOIN
(SELECT
cal.calculation, ltrim(p.oName) As oName,
p.DisplayingOrder as oDispOrder, p.oGrpId
FROM
[V].[dbo].[Reporto] p
CROSS JOIN
(SELECT 'Year to Date' as Calculation
UNION
SELECT 'Current Dim Date' as Calculation
UNION
SELECT 'Previous Year' as Calculation
UNION
SELECT 'Last Year Current Month' as Calculation) cal
CROSS JOIN
(SELECT
ltrim(b.m) As m, b.DisplayingOrder as mDispOrder,
b.Used as used
FROM
[V].[dbo].[ReportBusinessLine] b
WHERE b.used = 1) a
WHERE
(p.used = 1 and p.reportId = 1)) o
WHERE
dat.FiscalYear = 2013
我总是遇到以下错误:
Msg 4104, Level 16, State 1, Line 6
The multi-part identifier "a.m" could not be bound.
非常感谢。
答案 0 :(得分:4)
格式化得更清楚,您的from
声明是:
FROM [V].[dbo].[DimDate] dat CROSS JOIN
(SELECT cal.calculation, ltrim(p.oName) As oName, p.DisplayingOrder as oDispOrder, p.oGrpId
FROM [V].[dbo].[Reporto] p CROSS JOIN
(SELECT 'Year to Date' as Calculation UNION
SELECT 'Current Dim Date' as Calculation UNION
SELECT 'Previous Year' as Calculation UNION
SELECT 'Last Year Current Month' as Calculation
) cal CROSS JOIN
(SELECT ltrim(b.m) As m, b.DisplayingOrder as mDispOrder, b.Used as used
FROM [V].[dbo].[ReportBusinessLine] b
WHERE b.used = 1
) a
WHERE (p.used = 1 and p.reportId =1 )
) o
WHERE dat.FiscalYear = 2013
您可以清楚地看到a
是子查询中的表别名。如果您想要字段m
,则需要将其设置为o
:
FROM [V].[dbo].[DimDate] dat CROSS JOIN
(SELECT cal.calculation, ltrim(p.oName) As oName, p.DisplayingOrder as oDispOrder, p.oGrpId,
a.m
FROM [V].[dbo].[Reporto] p CROSS JOIN
(SELECT 'Year to Date' as Calculation UNION
SELECT 'Current Dim Date' as Calculation UNION
SELECT 'Previous Year' as Calculation UNION
SELECT 'Last Year Current Month' as Calculation
) cal CROSS JOIN
(SELECT ltrim(b.m) As m, b.DisplayingOrder as mDispOrder, b.Used as used
FROM [V].[dbo].[ReportBusinessLine] b
WHERE b.used = 1
) a
WHERE (p.used = 1 and p.reportId =1 )
) o
WHERE dat.FiscalYear = 2013
然后在o.m
中将其称为select
。
格式化代码使其可读,可以为查找和防止错误创造奇迹。
答案 1 :(得分:1)
试试这个 -
SELECT DISTINCT
dat.FiscalYear,
dat.monthname AS FiscalMonth,
dat.FiscalQuarter,
dat.FiscalSemester,
o.m AS m, --<--- invalid alias
o.oName AS o,
o.Calculation,
o.oDispOrder,
o.oGrpId
FROM [dbo].[DimDate] dat
CROSS JOIN (
SELECT
cal.calculation,
LTRIM(p.oName) AS oName,
p.DisplayingOrder AS oDispOrder,
p.oGrpId,
a.m --<--- missing in SELECT
FROM [dbo].[Reporto] p
CROSS JOIN (
SELECT 'Year to Date' AS Calculation
UNION ALL
SELECT 'Current Dim Date'
UNION ALL
SELECT 'Previous Year'
UNION ALL
SELECT 'Last Year Current Month'
) cal
CROSS JOIN (
SELECT
LTRIM(b.m) AS m,
b.DisplayingOrder AS mDispOrder,
b.Used AS used
FROM [dbo].[ReportBusinessLine] b
WHERE b.used = 1
) a
WHERE p.used = 1 AND p.reportId = 1
) o
WHERE dat.FiscalYear = 2013