-2

这是我的查询。问题是我试图将派生的“LineNo”字段应用为 where 子句。下面的查询不起作用。简单地说,如果 LineHrs 列的值 > 0,它将将此派生列设置为给定值(例如,如果 Line5Hrs = 1.4,则行的“LineNo”=“第 5 行”)。我想使用这个值来搜索特定行的所有工作。

SELECT      tblA.PROJECT_ID, 
            tblB.Line1Hrs, 
            tblB.Line2Hrs, 
            tblB.Line3Hrs, 
            tblB.Line4Hrs,
            tblB.Line5Hrs,
            tblB.Line6Hrs, 
            tblB.Line7Hrs, 
            "LineNo" =
                        CASE 
                            WHen tblB.Line1Hrs > 0 Then 'Line1'
                            WHen tblB.Line2Hrs > 0 Then 'Line2'
                            WHen tblB.Line3Hrs > 0 Then 'Line3'
                            WHen tblB.Line4Hrs > 0 Then 'Line4'
                            WHen tblB.Line5Hrs > 0 Then 'Line5'
                            WHen tblB.Line6Hrs > 0 Then 'Line6'
                            WHen tblB.Line7Hrs > 0 Then 'Line7'
                        End
FROM            tblA INNER JOIN tblB
                ON tblA.blah = tblB.blah AND
                tblA.blab = tblB.blab

WHERE         LineNo = 'Line5'
4

4 回答 4

1

您不能在 where 子句中使用派生/别名列名。尝试将查询封装为子查询,然后将 where 放在主查询上。

select * from (
    SELECT      tblA.PROJECT_ID, 
                tblB.Line1Hrs, 
                tblB.Line2Hrs, 
                tblB.Line3Hrs, 
                tblB.Line4Hrs,
                tblB.Line5Hrs,
                tblB.Line6Hrs, 
                tblB.Line7Hrs, 
                "LineNo" =
                            CASE 
                                WHen tblB.Line1Hrs > 0 Then 'Line1'
                                WHen tblB.Line2Hrs > 0 Then 'Line2'
                                WHen tblB.Line3Hrs > 0 Then 'Line3'
                                WHen tblB.Line4Hrs > 0 Then 'Line4'
                                WHen tblB.Line5Hrs > 0 Then 'Line5'
                                WHen tblB.Line6Hrs > 0 Then 'Line6'
                                WHen tblB.Line7Hrs > 0 Then 'Line7'
                            End
    FROM            tblA 
    INNER JOIN tblB
        ON tblA.blah = tblB.blah AND
           tblA.blab = tblB.blab
)
WHERE   LineNo = 'Line5'
于 2019-02-19T12:35:16.567 回答
0

使用 CTE 或子查询。例如:

WITH CTE AS
    (SELECT tblA.PROJECT_ID,
            tblB.Line1Hrs,
            tblB.Line2Hrs,
            tblB.Line3Hrs,
            tblB.Line4Hrs,
            tblB.Line5Hrs,
            tblB.Line6Hrs,
            tblB.Line7Hrs,
            CASE
                 WHEN tblB.Line1Hrs > 0 THEN 'Line1'
                 WHEN tblB.Line2Hrs > 0 THEN 'Line2'
                 WHEN tblB.Line3Hrs > 0 THEN 'Line3'
                 WHEN tblB.Line4Hrs > 0 THEN 'Line4'
                 WHEN tblB.Line5Hrs > 0 THEN 'Line5'
                 WHEN tblB.Line6Hrs > 0 THEN 'Line6'
                 WHEN tblB.Line7Hrs > 0 THEN 'Line7'
            END AS [LineNo]
     FROM tblA
          INNER JOIN tblB ON tblA.blah = tblB.blah
                         AND tblA.blab = tblB.blab)
SELECT PROJECT_ID,
       Line1Hrs,
       Line2Hrs,
       Line3Hrs,
       Line4Hrs,
       Line5Hrs,
       Line6Hrs,
       Line7Hrs,
       [LineNo]
FROM CTE
WHERE [LineNo] = 'Line5';

您不能SELECTWHERE子句中引用列(按别名),因为在 SELECT 语句的逻辑处理顺序WHERE之前评估SELECT

于 2019-02-19T12:34:33.357 回答
0

我喜欢apply用于此目的:

SELECT . . ., v.lineno
FROM tblA a INNER JOIN
     tblB b
     ON a.blah = b.blah AND
        a.blab = b.blab CROSS APPLY
     (VALUES (CASE WHEN b.Line1Hrs > 0 Then 'Line1'
                   WHEN b.Line2Hrs > 0 Then 'Line2'
                   WHEN b.Line3Hrs > 0 Then 'Line3'
                   WHEN b.Line4Hrs > 0 Then 'Line4'
                   WHEN b.Line5Hrs > 0 Then 'Line5'
                   WHEN b.Line6Hrs > 0 Then 'Line6'
                   WHEN b.Line7Hrs > 0 Then 'Line7'
              END)
     ) v(LineNo)
WHERE v.LineNo = 'Line5'
于 2019-02-19T12:35:24.907 回答
0

我会使用APPLY,因为您不能使用带有子句derived/alias的列名:WHERE

SELECT . . . 
FROM tblA INNER JOIN 
     tblB
     ON tblA.blah = tblB.blah AND 
        tblA.blab = tblB.blab  CROSS APPLY
     ( VALUES (CASE WHen tblB.Line1Hrs > 0 Then 'Line1'
                    WHen tblB.Line2Hrs > 0 Then 'Line2'
                    WHen tblB.Line3Hrs > 0 Then 'Line3'
                    WHen tblB.Line4Hrs > 0 Then 'Line4'
                    WHen tblB.Line5Hrs > 0 Then 'Line5'
                    WHen tblB.Line6Hrs > 0 Then 'Line6'
                    WHen tblB.Line7Hrs > 0 Then 'Line7'
               End)  
    ) BB (LineNo )
Where BB.LineNo = 'Line5';
于 2019-02-19T12:35:49.730 回答