【问题标题】:"Invalid column name", Order By on Alias of subquery“列名无效”,子查询别名的排序依据
【发布时间】:2012-05-29 12:51:40
【问题描述】:

我创建了一个存储过程,我想在其中添加替代 order by 子句。 问题是在“无效的列名'aantal regels'”上查询失败

这是我现在的查询。

SELECT 
            l.lead_id,
            l.afdeling_id,
            l.advertentie_id,
            l.naam,
            l.type,
            l.status,
            l.herkomst,
            l.aanmaakdatum,
            l.klant_id,
            l.overigegegevens,
            af.afdelingsnaam,
            (SELECT 
                COUNT(lead_regel_id) 
            FROM 
                Lead_regel As lr 
            Where 
                Lr.lead_id = l.lead_id And 
                lr.status <> 100
            ) 
            AS aantal_regels,

            (SELECT 
                COUNT(lead_id) 
            FROM 
                Lead_unread As lu 
            Where 
                lu.lead_id = l.lead_id And 
                lu.user_id = @uid
            ) 
            As lead_ongelezen,

            (SELECT 
                COUNT(lru.lead_regel_id) 
            FROM 
                Lead_regel As lr2 
            INNER JOIN 
                Lead_regel_unread As lru ON 
                lr2.lead_regel_id = lru.lead_regel_id 
            Where 
                lr2.lead_id = l.lead_id And 
                lru.user_id = @uid And 
                lr2.status <> 100
            ) 
            As lead_regel_ongelezen

        FROM 
            Lead AS l

        INNER JOIN 
            Afdeling AS af ON 
            l.afdeling_id = af.afdeling_id

        WHERE 
            l.afdeling_id = @aid AND 
            l.status <> 100

        ORDER BY
            CASE WHEN @orderby = 'default' THEN l.aanmaakdatum END DESC,
            CASE WHEN @orderby = 'type' THEN l.type END ASC, 
            CASE WHEN @orderby = 'naam' THEN l.naam END ASC,
            CASE WHEN @orderby = 'reacties' THEN aantal_regels END DESC

希望有人可以帮助我!

【问题讨论】:

    标签: sql stored-procedures sql-order-by alias


    【解决方案1】:

    您不能以这种方式按别名排序。

    第一个选项是重复代码。注意:只是因为你重复了代码,SQL 引擎不会天真到再次执行它,它会重复使用结果。

    ORDER BY
      CASE WHEN @orderby = 'default' THEN l.aanmaakdatum END DESC,
      CASE WHEN @orderby = 'type' THEN l.type END ASC, 
      CASE WHEN @orderby = 'naam' THEN l.naam END ASC,
      CASE WHEN @orderby = 'reacties' THEN (SELECT 
                                              COUNT(lead_regel_id) 
                                            FROM 
                                              Lead_regel As lr 
                                            WHERE
                                              Lr.lead_id = l.lead_id And 
                                              Lr.status <> 100
                                           ) END DESC
    

    或者所有这些都使用子查询...

      SELECT
        *
      FROM
      (
        yourQuery
      )
        AS sub_query
      ORDER BY
          CASE WHEN @orderby = 'default'  THEN aanmaakdatum  END DESC,
          CASE WHEN @orderby = 'type'     THEN type          END ASC, 
          CASE WHEN @orderby = 'naam'     THEN naam          END ASC,
          CASE WHEN @orderby = 'reacties' THEN aantal_regels END DESC
    

    【讨论】:

    • 我刚刚重复了代码。首先,我认为代码会以这种方式运行两次。通常我使用 MySQL,所以在 SQL 中有些东西对我来说是新的。
    • 这也有效,不会重复任何代码:CASE WHEN @orderby = 'reacties' THEN 12 END DESC
    • @ChrisGessler - 不,这行不通。 ORDER BY 12 确实会按SELECT 语句中的第 12 列排序。但是在CASE 语句中,12 是一个文字值,一个标量常量,只是数字 12。
    • @ChrisGessler - 先试后买。 SQL Fiddle 和其他地方可以让您在将假设作为事实发布之前测试您的假设;)[虽然,我承认,我经常因为完全相同的原因而遭受口蹄疫……]
    【解决方案2】:

    简短的版本是,虽然 ORDER BY 本身可以非常愉快地使用别名,但 ORDER BY 中的 CASE 语句不能。 CASE 语句将作为 SELECT 的一部分进行评估,因此在考虑任何别名之前。

    【讨论】:

    • 非常正确,但它可以使用列号,所以 CASE WHEN 'blah' THEN 12 END 应该可以很好地工作
    • @ChrisGessler - 不,这行不通。 ORDER BY 12 确实会按SELECT 语句中的第 12 列排序。但是在CASE 语句中,12 是一个文字值,一个标量常量,只是数字 12。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    • 1970-01-01
    相关资源
    最近更新 更多