查询语句sql server出错

时间:2014-01-13 11:55:11

标签: sql 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.

非常感谢。

2 个答案:

答案 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