简体   繁体   中英

Invalid column name 'ProposalTypeID'

Can you please advise me, what am I doing wrong in this stored procedure, it keeps complaining about "ProposalTypeID". Here is my code:

 SELECT assessmentecosystemcreditid,
       assessmentversionid,
       dbo.tblassessmentecosystemcredit.managementzoneid,
       (SELECT proposaltypeid
        FROM   tblassessment
        WHERE  assessmentid = (SELECT assessmentid
                               FROM   tblassessmentversion
                               WHERE  assessmentversionid =
               dbo.tblassessmentecosystemcredit.assessmentversionid)) AS
       ProposalTypeID,
       CASE
         WHEN sitevaluecurrentscore <= 17
              AND ( dbo.tblvegetationzone.eecid > 0 )
              AND ( proposaltypeid = 699 ) THEN 0
         ELSE numberofcredits
       END                                                            AS
       NumberOfCreditst
FROM   dbo.tblassessmentecosystemcredit
       INNER JOIN dbo.tblvegetationtype
               ON dbo.tblassessmentecosystemcredit.vegtypeid =
                  dbo.tblvegetationtype.vegtypeid
       INNER JOIN dbo.tblmanagementzone
               ON dbo.tblassessmentecosystemcredit.managementzoneid =
                  dbo.tblmanagementzone.managementzoneid
       INNER JOIN dbo.tblvegetationzone
               ON dbo.tblvegetationzone.vegetationzoneid =
                  dbo.tblmanagementzone.vegetationzoneid
WHERE  dbo.tblassessmentecosystemcredit.assessmentversionid =
       @AssessmentVersionID  

From what I can see in your query, you can't reference proposaltypeid in your CASE statement.

The table tblassessment is not in the FROM part of the top level SELECT statement.

Althought you could have a proposaltypeid in your other tables as well, but I assume that in your case this is the cause for the issue.

You're going to need a LEFT JOIN (to be sure) at the end, right before your last WHERE clause.

I'd change the query to the below code (will generate a messy result set) and then tune it from there (I'm not sure if you have a corresponding column for assessmentid in your other tables (which are in the top level SELECT ).

If you do, then change the ON condition for the LEFT JOIN to

TBA.assessmentid = "referencedTable"."correspondingColumn"

SELECT assessmentecosystemcreditid,
       assessmentversionid,
       dbo.tblassessmentecosystemcredit.managementzoneid,
       (SELECT proposaltypeid
        FROM   tblassessment
        WHERE  assessmentid = (SELECT assessmentid
                               FROM   tblassessmentversion
                               WHERE  assessmentversionid =
            dbo.tblassessmentecosystemcredit.assessmentversionid)) AS ProposalTypeID,
       CASE
         WHEN sitevaluecurrentscore <= 17
              AND ( dbo.tblvegetationzone.eecid > 0 )
              AND ( proposaltypeid = 699 ) THEN 0
         ELSE numberofcredits
       END AS NumberOfCreditst
FROM   dbo.tblassessmentecosystemcredit
       INNER JOIN dbo.tblvegetationtype
               ON dbo.tblassessmentecosystemcredit.vegtypeid =
                  dbo.tblvegetationtype.vegtypeid
       INNER JOIN dbo.tblmanagementzone
               ON dbo.tblassessmentecosystemcredit.managementzoneid =
                  dbo.tblmanagementzone.managementzoneid
       INNER JOIN dbo.tblvegetationzone
               ON dbo.tblvegetationzone.vegetationzoneid =
                  dbo.tblmanagementzone.vegetationzoneid
       LEFT JOIN tblassessment TBA ON 1 = 1
WHERE  dbo.tblassessmentecosystemcredit.assessmentversionid =
       @AssessmentVersionID 

It's quite a generic answer, based on the available information, but I think it will put you on the right track.

Update:

I believe this query will give you what you're looking for:

SELECT assessmentecosystemcreditid,
       assessmentversionid,
       dbo.tblassessmentecosystemcredit.managementzoneid,
       (SELECT proposaltypeid
        FROM   tblassessment
        WHERE  assessmentid = (SELECT assessmentid
                               FROM   tblassessmentversion
                               WHERE  assessmentversionid =
            dbo.tblassessmentecosystemcredit.assessmentversionid)) AS ProposalTypeID,
       CASE
         WHEN sitevaluecurrentscore <= 17
              AND ( dbo.tblvegetationzone.eecid > 0 )
              AND ( proposaltypeid = 699 ) THEN 0
         ELSE numberofcredits
       END AS NumberOfCreditst
FROM   dbo.tblassessmentecosystemcredit
       INNER JOIN dbo.tblvegetationtype
               ON dbo.tblassessmentecosystemcredit.vegtypeid =
                  dbo.tblvegetationtype.vegtypeid
       INNER JOIN dbo.tblmanagementzone
               ON dbo.tblassessmentecosystemcredit.managementzoneid =
                  dbo.tblmanagementzone.managementzoneid
       INNER JOIN dbo.tblvegetationzone
               ON dbo.tblvegetationzone.vegetationzoneid =
                  dbo.tblmanagementzone.vegetationzoneid

       -- added/modified below JOINs
       INNER JOIN dbo.Assesmentversion AV ON 
         AV.assessmentversionid = dbo.tblassessmentecosystemcredit.assessmentversionid
       INNER JOIN tblassessment TBA ON 
         TBA.AssessmentID = AV.AssessmentID 
WHERE  dbo.tblassessmentecosystemcredit.assessmentversionid =
       @AssessmentVersionID 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM