Oracle SQL选择查询

Oracle SQL选择查询,sql,oracle,Sql,Oracle,我有这张桌子: select * from scott.test; a b c --------- 26 R 4 26 T 5 26 S 2 25 Y 2 25 U 3 24 X 3 22 Z 3 21 P 3 我需要的是: 对于给定的“a”,我必须提取所有细节(a、b、c),如果有多个“a”,我只想提取“c”最高的一个。 例如,对于26,我只想提取: a b c 26 T 5 我是这样做的: select * from sco

我有这张桌子:

select * from scott.test;

a   b   c
---------
26  R   4
26  T   5
26  S   2
25  Y   2
25  U   3
24  X   3
22  Z   3
21  P   3
我需要的是: 对于给定的“a”,我必须提取所有细节(a、b、c),如果有多个“a”,我只想提取“c”最高的一个。 例如,对于26,我只想提取:

a  b  c
26 T  5
我是这样做的:

select * from scott.test where a = 26 and c = (select max(c) from scott.test where a = 26);
但是我只需要一个select(而不是select中的select)。能做到吗?谢谢大家!

像这样

WITH test
     AS (SELECT 26 AS a, 'R' AS b, 4 AS c FROM dual
         UNION ALL
         SELECT 26 AS a, 'T' AS b, 5 AS c FROM dual
         UNION ALL
         SELECT 26 AS a, 'S' AS b, 2 AS c FROM dual
         UNION ALL
         SELECT 25 AS a, 'Y' AS b, 2 AS c FROM dual
         UNION ALL
         SELECT 25 AS a, 'U' AS b, 3 AS c FROM dual
         UNION ALL
         SELECT 24 AS a, 'X' AS b, 3 AS c FROM dual
         UNION ALL
         SELECT 22 AS a, 'Z' AS b, 3 AS c FROM dual
         UNION ALL
         SELECT 21 AS a, 'P' AS b, 3 AS c FROM dual)
SELECT a, b, c
  FROM (SELECT a, b, c, max(c) OVER (PARTITION BY a) AS max_c
          FROM test
        WHERE A = 26)
 WHERE c = max_c
使用行数()分析函数可以实现它。但是,您需要使用子查询来完成此操作。但是使用WITH子句总是可以让它看起来不同

下面的查询将提示您输入列
a
的值,并返回列
c
最大值的行。WITH子句的第一部分仅用于构建示例数据进行演示,您只需要第二部分,即
t

比如说,

a
的值输入为
26

SQL> WITH data AS
  2    (SELECT 26 AS a, 'R' AS b, 4 AS c FROM dual
  3    UNION ALL
  4    SELECT 26 AS a, 'T' AS b, 5 AS c FROM dual
  5    UNION ALL
  6    SELECT 26 AS a, 'S' AS b, 2 AS c FROM dual
  7    UNION ALL
  8    SELECT 25 AS a, 'Y' AS b, 2 AS c FROM dual
  9    UNION ALL
 10    SELECT 25 AS a, 'U' AS b, 3 AS c FROM dual
 11    UNION ALL
 12    SELECT 24 AS a, 'X' AS b, 3 AS c FROM dual
 13    UNION ALL
 14    SELECT 22 AS a, 'Z' AS b, 3 AS c FROM dual
 15    UNION ALL
 16    SELECT 21 AS a, 'P' AS b, 3 AS c FROM dual
 17    ),
 18    t AS
 19    ( SELECT a,b,c,row_number() OVER(PARTITION BY a ORDER BY c DESC) rn FROM DATA
 20    )
 21  SELECT a,b,c FROM t WHERE a = &1 AND rn = 1;
Enter value for 1: 26
old  21: SELECT a,b,c FROM t WHERE a = &1 AND rn = 1
new  21: SELECT a,b,c FROM t WHERE a = 26 AND rn = 1

         A B          C
---------- - ----------
        26 T          5
a
的值输入为
25

SQL> WITH data AS
  2    (SELECT 26 AS a, 'R' AS b, 4 AS c FROM dual
  3    UNION ALL
  4    SELECT 26 AS a, 'T' AS b, 5 AS c FROM dual
  5    UNION ALL
  6    SELECT 26 AS a, 'S' AS b, 2 AS c FROM dual
  7    UNION ALL
  8    SELECT 25 AS a, 'Y' AS b, 2 AS c FROM dual
  9    UNION ALL
 10    SELECT 25 AS a, 'U' AS b, 3 AS c FROM dual
 11    UNION ALL
 12    SELECT 24 AS a, 'X' AS b, 3 AS c FROM dual
 13    UNION ALL
 14    SELECT 22 AS a, 'Z' AS b, 3 AS c FROM dual
 15    UNION ALL
 16    SELECT 21 AS a, 'P' AS b, 3 AS c FROM dual
 17    ),
 18    t AS
 19    ( SELECT a,b,c,row_number() OVER(PARTITION BY a ORDER BY c DESC) rn FROM DATA
 20    )
 21  SELECT a,b,c FROM t WHERE a = &1 AND rn = 1;
Enter value for 1: 25
old  21: SELECT a,b,c FROM t WHERE a = &1 AND rn = 1
new  21: SELECT a,b,c FROM t WHERE a = 25 AND rn = 1

         A B          C
---------- - ----------
        25 U          3

试试这个。它可能会起作用:)


您需要使用用例和行数分析函数。你的问题中的“尽快”是什么意思?为了尽快得到答案,您应该提供一个工作测试用例。创建和插入语句。至少是SQL小提琴。显示数据对想要帮助你的人没有帮助。你在一个表上执行SQL,所以仅仅看数据人们只能猜测,而不能给你完全正确的答案。@LalitKumarB我想他希望尽快(尽快)得到答案——我认为这是非常正确的rude@RaduGheorghiu我知道。我正在向OP解释这件事。它看起来不像。。一个选择,但两个,即使它们是嵌套的。如果@user3913719告诉我们单表扫描,那么不管有多少子查询。不知道“在选择中不选择”是什么意思:)是的,我同意你的看法,但OP提到了关于表格扫描的任何内容吗?
  select a,max(b) keep (dense_rank first order by c desc) b , max(c) keep (dense_rank first order by c desc) c from test
    where a = 26
    group by a