【问题标题】:Select first result only仅选择第一个结果
【发布时间】:2011-12-11 15:43:41
【问题描述】:

我写了以下查询:

SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL 
FROM CLIENT, (SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL 
              FROM PURCHASE GROUP BY CLIENTNO) TOTALS 
WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO AND ROWNUM <= 1 
ORDER BY TOTALS.TOTAL DESC;

但是它给了我错误的答案,但是如果我删除了ROWNUM &lt;= 1 子句,那么正确的答案就在结果集的顶部。

那么我可以在这个查询中进行哪些更改以使其产生正确的答案?

谢谢, 亚历克斯。

编辑:忘了说我只希望查询返回结果集中的第一个结果。

【问题讨论】:

  • 问题是rownum是在数据集排序之前分配的。

标签: sql oracle oracle10g


【解决方案1】:

ROWNUM 过滤器在排序之前应用。你需要做的是:

SELECT * FROM (
  SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL 
  FROM CLIENT, (SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL 
                  FROM PURCHASE GROUP BY CLIENTNO) TOTALS 
  WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO 
  ORDER BY TOTALS.TOTAL DESC
)
WHERE ROWNUM <= 1 

【讨论】:

【解决方案2】:

将rownum包装在另一个外部查询中:

select * from (
SELECT CLIENT.CLIENTNO, CLIENT.CNAME, TOTALS.TOTAL 
FROM CLIENT, (SELECT CLIENTNO, SUM(AMOUNT) AS TOTAL FROM PURCHASE GROUP BY CLIENTNO) TOTALS 
WHERE CLIENT.CLIENTNO = TOTALS.CLIENTNO ORDER BY TOTALS.TOTAL DESC)
where ROWNUM <= 1;

【讨论】:

    【解决方案3】:

    对于发现此问题的 MySQL 人员,使用 ROW_NUMBER() 获得相同的结果:

    WITH ranked AS (    
            SELECT
            ROW_NUMBER() OVER (
            PARTITION BY CLIENTNO
                ORDER BY TOTALS.TOTALS
            ) ROWNUM,
           CLIENT.CLIENTNO,
           .
           . )
    SELECT * FROM ranked
        WHERE ROWNUM <=1
    

    一些有用的信息:https://www.mysqltutorial.org/mysql-window-functions/mysql-row_number-functionhttps://dev.mysql.com/doc/refman/8.0/en/window-function-descriptions.html#function_row-number

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多