2014-01-13 23 views
1

当我执行如下因素查询:与查询语句获取SQL Server错误

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

你能设置你的表结构和SQLFiddle中的一些示例数据吗? – SchmitzIT

回答

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.mselect

格式化代码使其可读可以为查找和防止错误创造奇迹。

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