Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 需要使用内部查询或子查询获取具有最小值加上某个数字且不包含out的行_Sql_Oracle - Fatal编程技术网

Sql 需要使用内部查询或子查询获取具有最小值加上某个数字且不包含out的行

Sql 需要使用内部查询或子查询获取具有最小值加上某个数字且不包含out的行,sql,oracle,Sql,Oracle,我想要那些年龄大于最低年龄+5的行。最低年龄为10岁。 所以我希望所有年龄超过15岁的人 我内心的疑问是 CREATE TABLE "User" ( Name, Age ) AS SELECT 'Ira1', 10 FROM DUAL UNION ALL SELECT 'Ira2', 11 FROM DUAL UNION ALL SELECT 'Ira3', 15 FROM DUAL UNION ALL SELECT 'Ira4', 16 FROM DUAL UNION AL

我想要那些年龄大于最低年龄+5的行。最低年龄为10岁。 所以我希望所有年龄超过15岁的人

我内心的疑问是

CREATE TABLE "User" ( Name, Age ) AS
          SELECT 'Ira1', 10 FROM DUAL
UNION ALL SELECT 'Ira2', 11 FROM DUAL
UNION ALL SELECT 'Ira3', 15 FROM DUAL
UNION ALL SELECT 'Ira4', 16 FROM DUAL
UNION ALL SELECT 'Ira5', 17 FROM DUAL
返回:

select * from user
where age > (select age+5 from (select age from user order by age asc) where rownum=1);

有没有一种方法可以使用单个查询来完成它。我的意思是没有内部查询或子查询。

您可以使用
MIN
聚合功能(2次表扫描)稍微简化代码:

Oracle 11g R2架构设置

Ira4      16
Ira5      17
CREATE TABLE "User" ( Name, Age ) AS
          SELECT 'Ira1', 10 FROM DUAL
UNION ALL SELECT 'Ira2', 11 FROM DUAL
UNION ALL SELECT 'Ira3', 15 FROM DUAL
UNION ALL SELECT 'Ira4', 16 FROM DUAL
UNION ALL SELECT 'Ira5', 17 FROM DUAL
SELECT *
FROM   "User"
WHERE  Age > ( SELECT MIN( Age ) + 5 FROM "User" )
SELECT Name, Age
FROM (
  SELECT u.*,
         MIN( Age ) OVER ( ORDER BY Age ) AS min_age
  FROM   "User" u
)
WHERE  Age > Min_Age + 5
查询1

Ira4      16
Ira5      17
CREATE TABLE "User" ( Name, Age ) AS
          SELECT 'Ira1', 10 FROM DUAL
UNION ALL SELECT 'Ira2', 11 FROM DUAL
UNION ALL SELECT 'Ira3', 15 FROM DUAL
UNION ALL SELECT 'Ira4', 16 FROM DUAL
UNION ALL SELECT 'Ira5', 17 FROM DUAL
SELECT *
FROM   "User"
WHERE  Age > ( SELECT MIN( Age ) + 5 FROM "User" )
SELECT Name, Age
FROM (
  SELECT u.*,
         MIN( Age ) OVER ( ORDER BY Age ) AS min_age
  FROM   "User" u
)
WHERE  Age > Min_Age + 5

Ira4      16
Ira5      17
CREATE TABLE "User" ( Name, Age ) AS
          SELECT 'Ira1', 10 FROM DUAL
UNION ALL SELECT 'Ira2', 11 FROM DUAL
UNION ALL SELECT 'Ira3', 15 FROM DUAL
UNION ALL SELECT 'Ira4', 16 FROM DUAL
UNION ALL SELECT 'Ira5', 17 FROM DUAL
SELECT *
FROM   "User"
WHERE  Age > ( SELECT MIN( Age ) + 5 FROM "User" )
SELECT Name, Age
FROM (
  SELECT u.*,
         MIN( Age ) OVER ( ORDER BY Age ) AS min_age
  FROM   "User" u
)
WHERE  Age > Min_Age + 5
查询2

Ira4      16
Ira5      17
CREATE TABLE "User" ( Name, Age ) AS
          SELECT 'Ira1', 10 FROM DUAL
UNION ALL SELECT 'Ira2', 11 FROM DUAL
UNION ALL SELECT 'Ira3', 15 FROM DUAL
UNION ALL SELECT 'Ira4', 16 FROM DUAL
UNION ALL SELECT 'Ira5', 17 FROM DUAL
SELECT *
FROM   "User"
WHERE  Age > ( SELECT MIN( Age ) + 5 FROM "User" )
SELECT Name, Age
FROM (
  SELECT u.*,
         MIN( Age ) OVER ( ORDER BY Age ) AS min_age
  FROM   "User" u
)
WHERE  Age > Min_Age + 5
您可以使用分析功能(仅1次表格扫描)获得完全不同的解释计划:

Ira4      16
Ira5      17
CREATE TABLE "User" ( Name, Age ) AS
          SELECT 'Ira1', 10 FROM DUAL
UNION ALL SELECT 'Ira2', 11 FROM DUAL
UNION ALL SELECT 'Ira3', 15 FROM DUAL
UNION ALL SELECT 'Ira4', 16 FROM DUAL
UNION ALL SELECT 'Ira5', 17 FROM DUAL
SELECT *
FROM   "User"
WHERE  Age > ( SELECT MIN( Age ) + 5 FROM "User" )
SELECT Name, Age
FROM (
  SELECT u.*,
         MIN( Age ) OVER ( ORDER BY Age ) AS min_age
  FROM   "User" u
)
WHERE  Age > Min_Age + 5

您可以使用分析函数来获取最小年龄,但仍然需要一个子查询。不过,它只能让一个人通过桌子

| NAME | AGE |
|------|-----|
| Ira4 |  16 |
| Ira5 |  17 |

为什么要避免内部查询?这种愿望通常基于对SQL Optimizer如何生成执行计划的错误理解。SQL表示逻辑/功能,然后优化器创建代码来实现它。您应该只针对性能或行为。解释计划是否向您指出此查询的任何部分正在执行?我不进行内部查询的唯一原因是,我从多个表中获得的结果。在这之后,我需要在结果中找到最低值,并获取大于最低值加上一些数字的剩余结果。在执行min()时,您不需要“按年龄排序”。@Boneist谢谢-
min(年龄)OVER(年龄排序)
min(年龄)OVER()
给出细微不同的解释计划,并可以以不同的顺序返回结果-如果OP担心性能,那么值得分析所有选项,看看是否有任何特定的查询更快。是的,当我仔细检查两者之间的差异时,我看到了这一点,并感到惊讶!