【问题标题】:Error message "The multi part identifier could not be bound"错误消息“无法绑定多部分标识符”
【发布时间】:2017-05-26 02:17:19
【问题描述】:

我的代码是:

  ,CASE WHEN ResidenceInd = 1 THEN 'Residence' ELSE  'Day' END AS ClassType
  ,sc.Score
  ,'1' AS IsLP
  ,IncludeInGraph
  ,LessonOrder
FROM (
  SELECT
    sc.SchoolId
    ,sc.StudentId
    ,sc.DSTempSetColCalcId
    ,dcal.CalcType
    ,hdr.LessonPlanId
    ,hdr.StdtClassId
    ,Cls.ResidenceInd
    ,dcal.IncludeInGraph
    ,DHDR.LessonOrder
  FROM StdtSessColScore sc
    INNER JOIN DSTempSetColCalc dcal
      ON dcal.DSTempSetColCalcId = sc.DSTempSetColCalcId
    INNER JOIN StdtSessionHdr hdr
      ON hdr.StdtSessionHdrId=sc.StdtSessionHdrId
    INNER JOIN Class Cls 
      ON Cls.ClassId=hdr.StdtClassId 
    INNER JOIN DSTempHdr DHDR 
      ON DHDR.DSTempHdrId=hdr.DSTempHdrId
  WHERE 
   hdr.IOAInd='N' 
   AND hdr.SessMissTrailStus ='N' 
   AND hdr.SessionStatusCd='S' 
   AND (SELECT StatusId 
        FROM DSTempHdr DS 
        WHERE DS.DSTempHdrId = hdr.DSTempHdrId)
        <>
        (SELECT LookupId 
        FROM LookUp 
        WHERE LookupType = 'TemplateStatus' 
         AND LookupName='Deleted') 
  GROUP BY 
    DHDR.LessonOrder
    ,sc.SchoolId
    ,sc.StudentId
    ,sc.DSTempSetColCalcId
    ,dcal.CalcType
    ,hdr.LessonPlanId
    ,hdr.StdtClassId
    ,Cls.ResidenceInd
    ,dcal.IncludeInGraph
  ) AS StdCalcs
  ,ReportPeriod
WHERE 
  StdCalcs.StudentId=1240 
  AND CONVERT(DATE,'2016/01/02') <= CONVERT(DATE,ReportPeriod.PeriodDate)
  AND CONVERT(DATE,ReportPeriod.PeriodDate) <= CONVERT(DATE,'2016/12/28')
  AND sc.SchoolId = StdCalcs.SchoolId 
  AND sc.StudentId = StdCalcs.StudentId
  AND sc.DSTempSetColCalcId = StdCalcs.DSTempSetColCalcId
  AND CONVERT(DATE, Hdr.EndTs) = CONVERT(DATE, ReportPeriod.PeriodDate)
  AND Hdr.LessonPlanId = StdCalcs.LessonPlanId
  AND dcal.CalcType = StdCalcs.CalcType 
  AND Hdr.StdtClassId = StdCalcs.StdtClassId
  AND Hdr.IOAInd = 'N' AND Hdr.SessMissTrailStus ='N' 
  AND Hdr.SessionStatusCd = 'S' 
  AND sc.Score >= 0 
  AND Hdr.IsMaintanace = 0
GROUP BY 

代码继续……

我遇到了一个错误:

多部分标识符 sc.SchoolId,sc.StudentId,sc.DSTempSetColCalcId,Hdr.EndTs,Hdr.LessonPlanId,dcal.CalcType,Hdr.StdtClassId,Hdr.IOAInd,Hdr.SessMissTrailStus,Hdr.SessionStatusCd,sc.ScoreHdr.IsMaintanace无法绑定。

实际上我们如何解决它.. 我试图添加 sc.score 和

AND sc.SchoolId = StdCalcs.SchoolId 
AND sc.StudentId = StdCalcs.StudentId
AND sc.DSTempSetColCalcId = StdCalcs.DSTempSetColCalcId 
AND CONVERT(DATE, Hdr.EndTs) = CONVERT(DATE, ReportPeriod.PeriodDate)
AND Hdr.LessonPlanId=StdCalcs.LessonPlanId 
AND dcal.CalcType = StdCalcs.CalcType 
AND Hdr.StdtClassId = StdCalcs.StdtClassId
AND Hdr.IOAInd = 'N' AND Hdr.SessMissTrailStus = 'N'
AND Hdr.SessionStatusCd = 'S' 
AND sc.Score >= 0 
AND Hdr.IsMaintanace=0

感谢任何帮助

【问题讨论】:

  • 这有帮助吗? stackoverflow.com/questions/206558/… 。很有可能是笔误。如果你更好地格式化你的代码,它可能更容易找到。我会重新格式化以帮助您。
  • 哦,好吧,你重写了我的格式改进。这有点令人沮丧......
  • 您不能在外部查询中使用内部查询别名 (sc)。
  • 对不起..只是误会。我该如何撤消@ADyson
  • @Binto,在您的问题中添加完整的错误消息。

标签: sql asp.net sql-server tsql


【解决方案1】:

这不是答案!这只是关于如何构建查询以更好地理解它的建议。我建议你花更多的时间在如何美化你的代码上。将来您将花费更少的时间进行调试并了解您的代码在做什么。这是您的代码:

SELECT CASE 
            WHEN ResidenceInd = 1 THEN 'Residence' 
            ELSE 'Day' 
        END AS ClassType
    ,StdCalcs.Score --here was the wrong table-alias
    ,'1' AS IsLP
    ,IncludeInGraph
    ,LessonOrder
FROM 
(
    SELECT
        sc.SchoolId
        ,sc.StudentId
        ,sc.DSTempSetColCalcId
        ,dcal.CalcType
        ,hdr.LessonPlanId
        ,hdr.StdtClassId
        ,Cls.ResidenceInd
        ,dcal.IncludeInGraph
        ,DHDR.LessonOrder
    FROM StdtSessColScore AS sc INNER JOIN 
        DSTempSetColCalc AS dcal ON dcal.DSTempSetColCalcId = sc.DSTempSetColCalcId INNER JOIN 
        StdtSessionHdr AS hdr ON hdr.StdtSessionHdrId = sc.StdtSessionHdrId INNER JOIN 
        Class AS Cls ON Cls.ClassId = hdr.StdtClassId INNER JOIN 
        DSTempHdr AS DHDR ON DHDR.DSTempHdrId = hdr.DSTempHdrId
    WHERE hdr.IOAInd = 'N' AND 
        hdr.SessMissTrailStus = 'N' AND 
        hdr.SessionStatusCd = 'S' AND 
        (
            SELECT StatusId 
            FROM DSTempHdr DS 
            WHERE DS.DSTempHdrId = hdr.DSTempHdrId
        ) <> 
        (
            SELECT LookupId 
            FROM LookUp 
            WHERE LookupType = 'TemplateStatus' AND 
                LookupName = 'Deleted'
        )
    GROUP BY DHDR.LessonOrder
        ,sc.SchoolId
        ,sc.StudentId
        ,sc.DSTempSetColCalcId
        ,dcal.CalcType
        ,hdr.LessonPlanId
        ,hdr.StdtClassId
        ,Cls.ResidenceInd
        ,dcal.IncludeInGraph
) AS StdCalcs,
    ReportPeriod
WHERE StdCalcs.StudentId = 1240 AND 
    CONVERT(DATE, '2016/01/02') <= CONVERT(DATE, ReportPeriod.PeriodDate) AND
    CONVERT(DATE, ReportPeriod.PeriodDate) <= CONVERT(DATE, '2016/12/28') AND 
    sc.SchoolId = StdCalcs.SchoolId AND 
    sc.StudentId = StdCalcs.StudentId AND 
    sc.DSTempSetColCalcId=StdCalcs.DSTempSetColCalcId AND 
    CONVERT(DATE, Hdr.EndTs) = CONVERT(DATE, ReportPeriod.PeriodDate) AND 
    Hdr.LessonPlanId=StdCalcs.LessonPlanId AND 
    dcal.CalcType = StdCalcs.CalcType AND 
    Hdr.StdtClassId = StdCalcs.StdtClassId AND 
    Hdr.IOAInd = 'N' AND 
    Hdr.SessMissTrailStus = 'N' AND 
    Hdr.SessionStatusCd = 'S' AND 
    sc.Score >= 0 AND 
    Hdr.IsMaintanace = 0
GROUP BY 

select、group by、order by 子句中:尝试将每一列放在它自己的行上。

form 子句中:将每个表和连接中的 on 放在一行上。

where 子句中:将每个条件放在一行中。将 AND 或 OR 置于开头或结尾。

Everywhere:在等号之前和之后写一个空格。您可以更轻松地查看左右成员。

【讨论】:

    【解决方案2】:

    检查下面代码中的注释。如果您从子查询中获取数据作为表,则不能使用子查询的内部表别名,但必须使用您给它的别名作为表。

    CASE WHEN ResidenceInd=1 THEN 'Residence' ELSE  'Day' END AS ClassType
          ,StdCalcs.Score --here was the wrong table-alias
          ,'1' AS IsLP
          ,IncludeInGraph
          ,LessonOrder
          FROM (
          SELECT
          sc.SchoolId
          ,sc.StudentId
          ,sc.DSTempSetColCalcId
          ,dcal.CalcType
          ,hdr.LessonPlanId
          ,hdr.StdtClassId
          ,Cls.ResidenceInd
          ,dcal.IncludeInGraph
          ,DHDR.LessonOrder
          FROM StdtSessColScore  sc
          INNER JOIN DSTempSetColCalc dcal
          ON dcal.DSTempSetColCalcId = sc.DSTempSetColCalcId
          INNER JOIN StdtSessionHdr hdr
          ON hdr.StdtSessionHdrId=sc.StdtSessionHdrId
          INNER JOIN Class Cls ON Cls.ClassId=hdr.StdtClassId 
          INNER JOIN DSTempHdr DHDR ON DHDR.DSTempHdrId=hdr.DSTempHdrId
          WHERE hdr.IOAInd='N' AND hdr.SessMissTrailStus ='N' AND hdr.SessionStatusCd='S' AND (SELECT StatusId FROM DSTempHdr 
          DS WHERE DS.DSTempHdrId=hdr.DSTempHdrId)<>(SELECT LookupId FROM LookUp WHERE LookupType='TemplateStatus' AND LookupName='Deleted') 
          GROUP BY 
          DHDR.LessonOrder
          ,sc.SchoolId
          ,sc.StudentId
          ,sc.DSTempSetColCalcId
          ,dcal.CalcType
          ,hdr.LessonPlanId
          ,hdr.StdtClassId
          ,Cls.ResidenceInd
          ,dcal.IncludeInGraph
          ) AS StdCalcs
          ,ReportPeriod
          WHERE StdCalcs.StudentId=1240 AND CONVERT(DATE,'2016/01/02') <= CONVERT(DATE,ReportPeriod.PeriodDate) AND
          CONVERT(DATE,ReportPeriod.PeriodDate) <= CONVERT(DATE,'2016/12/28') and sc.SchoolId=StdCalcs.SchoolId AND sc.StudentId=StdCalcs.StudentId
          AND sc.DSTempSetColCalcId=StdCalcs.DSTempSetColCalcId AND CONVERT(DATE,Hdr.EndTs)=CONVERT(DATE,ReportPeriod.PeriodDate)
          AND Hdr.LessonPlanId=StdCalcs.LessonPlanId AND dcal.CalcType=StdCalcs.CalcType AND Hdr.StdtClassId=StdCalcs.StdtClassId
          AND Hdr.IOAInd='N' AND Hdr.SessMissTrailStus ='N' AND Hdr.SessionStatusCd='S' AND sc.Score>=0 AND Hdr.IsMaintanace=0
          GROUP BY 
    

    【讨论】:

    • @Nițu Alexandru:根据您在下面的“答案”,也许您遗漏了代码不是我的,我只是修复了错误并编辑了作者的代码并添加了评论。所以,让你的荷尔蒙平静下来:)
    猜你喜欢
    • 2020-06-16
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多