【问题标题】:MS-Access -> SELECT AS + ORDER BY = errorMS-Access -> SELECT AS + ORDER BY = 错误
【发布时间】:2010-10-17 15:18:58
【问题描述】:

我正在尝试进行查询以检索销售甜味产品最多的地区。 “grupo_produto”是产品类型,“regiao”是地区。所以我得到了这个查询:

SELECT TOP 1 r.nm_regiao,  (SELECT COUNT(*)
        FROM Dw_Empresa
        WHERE grupo_produto='1' AND 
        cod_regiao = d.cod_regiao) as total 
FROM Dw_Empresa d
INNER JOIN tb_regiao r ON r.cod_regiao = d.cod_regiao ORDER BY total DESC

然后,当我运行查询时,MS-Access 会询问“total”参数。为什么它不考虑我在 select 子句中创建的新创建的“列”?

提前致谢!

【问题讨论】:

    标签: sql ms-access select sql-order-by


    【解决方案1】:

    我知道的老问题,但它可能对知道的人有所帮助,而不是你不能按别名排序,你可以按列索引排序。例如,这将正常工作:

    SELECT 
     firstColumn,
     IIF(secondColumn = '', thirdColumn, secondColumn) As yourAlias
    FROM
     yourTable
    ORDER BY
     2 ASC
    

    然后,结果将按第二列中的值排序,即别名“yourAlias”。

    【讨论】:

      【解决方案2】:

      别名仅在查询输出中可用。您不能在查询的其他部分使用它们。不幸的是,您必须复制并粘贴整个子查询才能使其正常工作。

      【讨论】:

      • 不能使用别名,但可以重复被别名的表达式。 Jet 只会计算一次,所以它只是在打字方面效率低下。
      • 在这种情况下不是。如果您尝试通过发布的子查询进行排序,则会收到错误消息。
      • “别名仅在查询输出中有用”——我不同意:我认为能够在ORDER BY 子句中使用“别名”非常有用。
      • “您不能在查询的其他部分使用 ['aliases']” - 这是因为那些“其他部分”在 SELECT 子句之前解决。但是,ORDER BY 子句在 SELECT 子句之后应用,所以它不应该是一个问题......它不应该但是在 Access 中它是:(
      • 别名在整个查询中有用,包括SELECT 列表中的其他字段。我应该说“可用”。我将进行编辑以澄清。
      【解决方案3】:

      你可以这样做

      select * from(
        select a + b as c, * from table)
        order by c
      

      Access 与 Sql Server 相比有一些不同。

      【讨论】:

        【解决方案4】:

        为什么不考虑新 创建了我在选择中创建的“列” 子句?

        因为 Access (ACE/Jet) 不符合 SQL-92 标准。

        考虑这个例子,它是有效的 SQL-92:

        SELECT a AS x, c - b AS y
          FROM MyTable
         ORDER
            BY x, y;
        

        事实上,xyORDER BY 子句中唯一有效的元素,因为所有其他元素都超出了范围(SELECT 子句中的列的序号是有效的,尽管它们的使用 id 已弃用)。

        但是,Access 对上述语法感到窒息。等效的 Access 语法是这样的:

        SELECT a AS x, c - b AS y
          FROM MyTable
         ORDER
            BY a, c - b;
        

        但是,我从@Remou 的 cmets 了解到,ORDER BY 子句中的子查询在 Access 中无效。

        【讨论】:

          【解决方案5】:

          尝试使用子查询并在外部查询中对结果进行排序。

          SELECT TOP 1 * FROM
          (
              SELECT
                  r.nm_regiao, 
                  (SELECT COUNT(*)
                   FROM Dw_Empresa
                   WHERE grupo_produto='1' AND cod_regiao = d.cod_regiao) as total 
              FROM Dw_Empresa d
              INNER JOIN tb_regiao r ON r.cod_regiao = d.cod_regiao
          ) T1
          ORDER BY total DESC
          

          (未测试。)

          【讨论】:

          • 这很奇怪。当我尝试这样做时,“总计”列全部变为 0,而不是显示一行,而是得到 10 个类似的行。我试图找出原因。不过,就是这样。谢谢
          【解决方案6】:

          怎么样:

          SELECT TOP 1  r.nm_regiao 
          FROM (SELECT Dw_Empresa.cod_regiao, 
                       Count(Dw_Empresa.cod_regiao) AS CountOfcod_regiao
                FROM Dw_Empresa
                WHERE Dw_Empresa.[grupo_produto]='1'
                GROUP BY Dw_Empresa.cod_regiao
                ORDER BY Count(Dw_Empresa.cod_regiao) DESC) d
          INNER JOIN tb_regiao AS r 
          ON d.cod_regiao = r.cod_regiao
          

          【讨论】:

            【解决方案7】:

            我建议使用中间查询。

             SELECT r.nm_regiao, d.grupo_produto, COUNT(*) AS total
               FROM Dw_Empresa d INNER JOIN tb_regiao r ON r.cod_regiao = d.cod_regiao
               GROUP BY r.nm_regiao, d.grupo_produto;
            

            如果你调用 GroupTotalsByRegion,你可以这样做:

            SELECT TOP 1 nm_regiao, total FROM GroupTotalsByRegion 
              WHERE grupo_produto = '1' ORDER BY total DESC
            

            您可能认为创建中间查询是额外的工作(从某种意义上说确实如此),但您也会发现许多其他查询将基于 GroupTotalsByRegion。您希望避免在许多其他查询中重复该逻辑。通过将其保留在一个视图中,您可以提供一种简化的途径来回答许多其他问题。

            【讨论】:

            • 您不必保存它——您应该能够在 FROM 子句中使用派生表来代替保存的 QueryDef。
            【解决方案8】:

            如何使用: WITH xx AS ( SELECT TOP 1 r.nm_regiao, (SELECT COUNT(*) FROM Dw_Empresa 其中 grupo_produto='1' 和 cod_regiao = d.cod_regiao) 总计 FROM Dw_Empresa d INNER JOIN tb_regiao r ON r.cod_regiao = d.cod_regiao ) SELECT * FROM xx ORDER BY 总计

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2016-05-25
              • 1970-01-01
              • 1970-01-01
              • 2019-03-15
              • 1970-01-01
              • 2014-12-25
              • 1970-01-01
              相关资源
              最近更新 更多