Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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
访问Oracle SQL中与LIMIT子句组合的主表字段的子查询_Sql_Oracle_Oracle11g_Subquery_Correlated Subquery - Fatal编程技术网

访问Oracle SQL中与LIMIT子句组合的主表字段的子查询

访问Oracle SQL中与LIMIT子句组合的主表字段的子查询,sql,oracle,oracle11g,subquery,correlated-subquery,Sql,Oracle,Oracle11g,Subquery,Correlated Subquery,我有一个表用户和一个表任务。任务按重要性排序,并分配给用户的任务列表。任务的状态为:就绪或未就绪。现在,我想列出所有用户,他们最重要的任务也已准备就绪 有趣的要求是,首先需要对每个用户的任务进行筛选和排序,然后选择最重要的任务。这就是我想到的: SELECT Users.name, (SELECT * FROM (SELECT Tasks.description FROM Tasks WHERE Tasks.task

我有一个表用户和一个表任务。任务按重要性排序,并分配给用户的任务列表。任务的状态为:就绪或未就绪。现在,我想列出所有用户,他们最重要的任务也已准备就绪

有趣的要求是,首先需要对每个用户的任务进行筛选和排序,然后选择最重要的任务。这就是我想到的:

SELECT Users.name,
    (SELECT *
        FROM (SELECT Tasks.description
              FROM Tasks
              WHERE Tasks.taskListCode = Users.taskListCode AND Tasks.isReady
              ORDER BY Tasks.importance DESC)
        WHERE rownum = 1
    ) AS nextTask
    FROM Users
但是,这会导致错误

ORA-00904: "Users"."taskListCode": invalid identifier
我想原因是。但是,我需要两个级别,以便可以执行
,其中rownum=1

我也在没有相关子查询的情况下尝试了它:

SELECT Users.name, Task.description
FROM Users
LEFT JOIN Tasks nextTask ON
    nextTask.taskListCode = Users.taskListCode AND
    nextTask.importance = MAX(
        SELECT tasks.importance 
        FROM tasks
        WHERE tasks.isReady
        GROUP BY tasks.id
    )
这将导致错误

ORA-00934: group function is not allowed here

如何解决此问题?

请尝试使用分析功能:

with tp as (select t.*, row_number() over (partition by taskListCode order by importance desc) r 
            from tasks t 
            where isReady = 1 /*or 'Y' or what is positive value here*/)
select u.name, tp.description 
  from users u left outer join tp on (u.taskListCode = tp.taskListCode) 
  where tp.r = 1;

一种解决方法是使用
保留

SELECT u.name,
       (SELECT MAX(t.description) KEEP (DENSE_RANK FIRST ORDER BY T.importance DESC)
        FROM Tasks t
        WHERE t.taskListCode = u.taskListCode AND t.isReady
       ) as nextTask
FROM Users u;

这是一个使用聚合而不是分析函数的解决方案。您可能希望对解析函数解决方案运行此命令,以查看哪个更快;在许多情况下,聚合查询(稍微)更快,但这取决于您的数据、索引使用情况等

这个解决方案与Gordon试图做的类似。我不知道他为什么用相关子查询而不是直接连接来编写它(也不知道它是否有效——我从未见过第一个/最后一个用于相关子查询的函数)

如果
重要性
列中可能存在
NULL
,则它可能无法完全正常工作-然后您需要首先在
t.importance
之后和
之前添加
NULL
)。注意:
max(t.description)
是必需的,因为“重要性”可能有联系(对于给定用户来说,两个任务具有相同的、最高的重要性)。在这种情况下,必须选择一项任务。如果按重要性排序是严格的(没有关系),则
MAX()
不会执行任何操作,因为它只选择了一组值的最大值,但编译器事先不知道这一点,因此它确实需要
MAX()


这个
MAX(t.description)
看起来很奇怪,或者它是解决问题所必需的?否则,这看起来比Kacper的答案更简洁。你知道表演是否不同吗?@Yogu。事实上,它看起来确实很奇怪。
MAX()。所以
MIN()
MAX()
会做同样的事情。我从未在可能返回多行值的上下文中使用过
KEEP
;但我认为聚合函数在某些情况下可能有用。@GordonLinoff——“密集度排名第一”可能会出现关系,如果按“重要性”排序不严格的话。可能有三项任务具有相同的、最高的重要性。然后MAX将按字母顺序选择最新描述的任务。MIN将按字母顺序从最重要的任务中选择第一个描述。您所说的
WHERE task.isready是什么意思?Oracle数据库中没有布尔值。
select u.name, 
       max(t.description) keep (dense_rank last order by t.importance) as descr
from   users u left outer join tasks t on u.tasklistcode = t.tasklistcode
where  t.isready = 'Y'
group by u.name