【问题标题】:Is it possible to do so without using nested SELECTS?是否可以在不使用嵌套 SELECTS 的情况下这样做?
【发布时间】:2016-03-31 12:54:35
【问题描述】:

假设我有下表:

--------------------------------------------
ReceiptNo |    Date     | EmployeeID | Qty
--------------------------------------------
    1     | 12-DEC-2015 |     1      | 200
    2     | 13-DEC-2015 |     1      | 500
    3     | 13-DEC-2015 |     1      | 100
    4     | 13-DEC-2015 |     3      | 100
    5     | 13-DEC-2015 |     3      | 500
    6     | 13-DEC-2015 |     2      |  75
--------------------------------------------

显示最大数量的元组。

答案:

--------------------------------------------
    2     | 13-DEC-2015 |     1      | 500
    5     | 13-DEC-2015 |     3      | 500
--------------------------------------------

我需要使用聚合函数MAX()

不使用嵌套SELECTS是否可以这样做?

【问题讨论】:

  • 你用的是什么关系型数据库?
  • 不是跨平台的。为什么需要这个?
  • 试试SELECT * FROM ... HAVING Qty = MAX( Qty )
  • @HannoBinder 在 Oracle 或 SQL Server 中无效。
  • 在 Sybase 的 T-SQL 中有效。太糟糕了,它不在 SQL Server 中。

标签: sql sql-server oracle11g


【解决方案1】:

不使用max,而是使用没有嵌套查询的普通“跨平台”ANSI SQL:

SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t2 ON t2.Qty > t1.Qty
WHERE t2.Qty IS NULL

检索同一个表中没有条数量较多的所有记录。

【讨论】:

    【解决方案2】:

    没有。

    您不能显示最大数量的元组,使用 max 聚合函数同时避免嵌套选择。

    VR46 发布了一个很好的方法来做到这一点,无需使用嵌套选择,也无需 max 聚合。在 Oracle 12c 中使用FETCH 子句可以使用类似的方法:

    select *
      from table
     order by qty desc
     fetch first row with ties
    

    如果你想使用max 聚合,可以这样做:

    select *
      from table
     where qty = (select max(qty) from table)
    

    另一种方法是使用rankdense_rank 窗口函数,但它们需要嵌套选择,并且不要使用max 聚合函数:

    select *
      from (select t.*,
                   dense_rank() over (order by t.qty desc) as rnk
              from table t) t
     where t.rnk = 1
    

    【讨论】:

      【解决方案3】:

      sql server试试这个

      SELECT TOP 1 WITH TIES *
      FROM TABLE
      ORDER BY QTY DESC
      

      【讨论】:

      • @anonymous:这样改变问题是不好的形式。如果您需要max,那么您将需要一个子查询,这正是您所说的您不想要的。
      • @anonymous 为什么需要使用 max?这是作业吗?无论如何,这将是一个嵌套选择。 where qty=(select max
      • @anonymous 因为您的问题似乎具有任意且不兼容的限制,因此至少其中一个必须去了解它们为什么存在很重要。
      • @anonymous:不知道你要去哪里。你说我需要指出我的问题。但是你还没有解释那个问题是什么。我只是担心这是XY problem的经典案例。
      • 我猜选择的解决方案已经嵌套了select
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多