简体   繁体   中英

SQL Server multiple table alias precedence > missing column alias

Wading through more 'obfuscated' code and refactoring for understanding. Thought this bit was straight forward till I hit the third case statement. Can I assume that quoted columns refer to the t_g3 view?

The original FROM portion posted below.

FROM  
    [GCCC_ProjectServer_Reporting].dbo.MSP_EpmProject_UserView AS p
INNER JOIN 
    (SELECT 
         t_g3.ProjectUID as ProjectUID
                 ,CASE WHEN @vLastBaseline = 'BL1' AND t_g3.TaskBaseline1StartDate IS NOT NULL THEN t_g3.TaskBaseline1StartDate
                          WHEN @vLastBaseline = 'BL1' AND t_g3.TaskBaseline1StartDate IS NULL THEN t_g3.TaskBaseline5StartDate
                          WHEN @vLastBaseline = 'BL2' AND t_g3.TaskBaseline2StartDate IS NOT NULL THEN t_g3.TaskBaseline2StartDate
                          WHEN @vLastBaseline = 'BL2' AND t_g3.TaskBaseline2StartDate IS NULL THEN t_g3.TaskBaseline5StartDate
                          WHEN @vLastBaseline = 'BL3' AND t_g3.TaskBaseline3StartDate IS NOT NULL THEN t_g3.TaskBaseline3StartDate
                          WHEN @vLastBaseline = 'BL3' AND t_g3.TaskBaseline3StartDate IS NULL THEN t_g3.TaskBaseline5StartDate
                          WHEN @vLastBaseline = 'BL4' AND t_g3.TaskBaseline4StartDate IS NOT NULL THEN t_g3.TaskBaseline4StartDate
                          WHEN @vLastBaseline = 'BL4' AND t_g3.TaskBaseline4StartDate IS NULL THEN t_g3.TaskBaseline5StartDate     
                          ELSE t_g3.TaskBaseline1StartDate          
                 END AS g3_LastBaseline     
                 ,CASE WHEN @vLastBaseline = 'BL1' AND t_cs.TaskBaseline1StartDate IS NOT NULL THEN t_cs.TaskBaseline1StartDate
                          WHEN @vLastBaseline = 'BL1' AND t_cs.TaskBaseline1StartDate IS NULL THEN t_cs.TaskBaseline5StartDate
                          WHEN @vLastBaseline = 'BL2' AND t_cs.TaskBaseline2StartDate IS NOT NULL THEN t_cs.TaskBaseline2StartDate
                          WHEN @vLastBaseline = 'BL2' AND t_cs.TaskBaseline2StartDate IS NULL THEN t_cs.TaskBaseline5StartDate
                          WHEN @vLastBaseline = 'BL3' AND t_cs.TaskBaseline3StartDate IS NOT NULL THEN t_cs.TaskBaseline3StartDate
                          WHEN @vLastBaseline = 'BL3' AND t_cs.TaskBaseline3StartDate IS NULL THEN t_cs.TaskBaseline5StartDate
                          WHEN @vLastBaseline = 'BL4' AND t_cs.TaskBaseline4StartDate IS NOT NULL THEN t_cs.TaskBaseline4StartDate
                          WHEN @vLastBaseline = 'BL4' AND t_cs.TaskBaseline4StartDate IS NULL THEN t_cs.TaskBaseline5StartDate
                          ELSE t_cs.TaskBaseline1StartDate                
                 END AS cs_LastBaseline     
                 ,CASE WHEN @vLastBaseline = 'BL1' AND t_g3.TaskBaseline1StartDate IS NOT NULL THEN 'TaskBaseline1StartDate'
                          WHEN @vLastBaseline = 'BL1' AND t_g3.TaskBaseline1StartDate IS NULL THEN 'TaskBaseline5StartDate'
                          WHEN @vLastBaseline = 'BL2' AND t_g3.TaskBaseline2StartDate IS NOT NULL THEN 'TaskBaseline2StartDate'
                          WHEN @vLastBaseline = 'BL2' AND t_g3.TaskBaseline2StartDate IS NULL THEN 'TaskBaseline5StartDate'
                          WHEN @vLastBaseline = 'BL3' AND t_g3.TaskBaseline3StartDate IS NOT NULL THEN 'TaskBaseline3StartDate'
                          WHEN @vLastBaseline = 'BL3' AND t_g3.TaskBaseline3StartDate IS NULL THEN 'TaskBaseline5StartDate'
                          WHEN @vLastBaseline = 'BL4' AND t_g3.TaskBaseline4StartDate IS NOT NULL THEN 'TaskBaseline4StartDate'
                          WHEN @vLastBaseline = 'BL4' AND t_g3.TaskBaseline4StartDate IS NULL THEN 'TaskBaseline5StartDate'
                          ELSE 't_cs.TaskBaseline1StartDate'        
                 END AS LastBaselineSource
              FROM GCCC_ProjectServer_Reporting.dbo.MSP_EpmTask_UserView AS t_g3
                    LEFT JOIN 
                     GCCC_ProjectServer_Reporting.dbo.MSP_EpmTask_UserView AS t_cs
                    ON t_g3.ProjectUID = t_cs.ProjectUID
                    AND t_cs.TaskIsActive = 1
                    AND t_cs.TaskName = 'Construction Start'
              WHERE t_g3.TaskIsActive = 1
              AND t_g3.TaskName = 'Gate 3 Approval'
              ) as BL
        ON p.ProjectUID = BL.ProjectUID

code here

Another example where single quotes are used as column alias wrappers. Quite common throughout the code base. This is why I was thinking the above issue was column alias related.

SELECT    p0.[Project No], 
    p0.ProjectName,
    isnull(p0.Budg_Centre + ' - ' + p0.Budg_CentreName,' - ') as 'BudgetCentre',
    p0.Budg_Centre,p0.Budg_CentreName,
CASE WHEN DATEDIFF(d,p0.ProjectStartDate,p0.ProjectFinishDate) > 40
                THEN 'Scheduled'
                ELSE 'Unscheduled' END as 'Schedule Status',
            CapFor.Forecasting_Month, 
            CapFor.Forecasting_Year, 
            CapFor.FinancialYr, 
            p0.ProjectOwnerName, 

The 3rd case is repeating the same logic as the first case but reporting what column that first case selected as a string.

Single quotes ( ' ) are only ever string literal delimiters 1 .

Double quotes ( " ) may be used as string delimiters or to quote identifiers (in the same way that [] can be used to quote identifiers). How they should be interpreted depends on the current setting for QUOTED_IDENTIFIER .

So no, do not replace the strings with column references.


1 I'm bound to have forgotten some edge case when I make such a confident assertion, aren't I.

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