Sql 如何连接两个查询,其中一个查询是从另一个查询派生的?

Sql 如何连接两个查询,其中一个查询是从另一个查询派生的?,sql,oracle,join,Sql,Oracle,Join,谁能解释一下这有什么不对吗?我的问题是这样的 select t1.year, t1.empid, t2.tcost from (select year,empid,sum(cost) as total from orders group by year,empid) t1 inner join (select year, max(total) from t1 group by year) t2 on t1.year= t2.year 我收到如下错误消息 ERROR at line 3: OR

谁能解释一下这有什么不对吗?我的问题是这样的

select t1.year, t1.empid, t2.tcost
from (select year,empid,sum(cost) as total from orders group by year,empid) t1
inner join (select year, max(total) from t1 group by year) t2
on t1.year= t2.year
我收到如下错误消息

ERROR at line 3:

ORA-00942: table or view does not exist
我知道我可以用WITH子句实现这个目的,但我想知道在这种情况下如何使用join

提前谢谢

SELECT t1.year, t1.empid, t2.tcost
FROM (SELECT year, empid, sum(cost) AS total
      FROM orders
      GROUP BY year, empid) t1
     INNER JOIN (SELECT year, max(total) **AS tcost**
                 FROM t1 **<-- ?? No, you need to specify a table**
                 GROUP BY year) t2
         ON t1.year = t2.year
t1和INTERNAR之间有一个逗号,在FROM t1中语法错误,无法将一个内部表连接到另一个内部表。此外,maxtotal还需要使用别名。以上所示

t1和INTERNAR之间有一个逗号,在FROM t1中语法错误,无法将一个内部表连接到另一个内部表。此外,maxtotal还需要使用别名。上面都显示了。

试试这个

select t.year, t.empid, t.total
from (select t1.year,t1.empid,sum(t1.cost) as total from orders as t1  
inner join orders as t2 on t1.year= t2.year  group by t1.year,t1.empid) t
试试这个

select t.year, t.empid, t.total
from (select t1.year,t1.empid,sum(t1.cost) as total from orders as t1  
inner join orders as t2 on t1.year= t2.year  group by t1.year,t1.empid) t

如果在查询中使用自联接,通常会有一个基于分析函数的等效查询。 优点是,在大多数情况下,执行时间更短。在这里,您可以使用:

样本数据和输出:

create table orders (year number(4), empid number(5), cost number(10,2));
insert into orders values (2010, 1, 100);
insert into orders values (2010, 1, 115);
insert into orders values (2010, 1, 207);
insert into orders values (2010, 2, 104);
insert into orders values (2011, 1,  90);
insert into orders values (2011, 2,  15);
insert into orders values (2011, 2, 107);
insert into orders values (2011, 3, 100);
输出:

YEAR  EMPID  SUM_COST
----  -----  --------
2010      1       422
2011      2       122
编辑:如果你想在这里进行自连接,我怀疑你是否可以删除with子句。with特别是在使用复杂子查询两次或两次以上时使用。 如果您坚持加入,而不是像您在评论中所建议的那样,使用where year,tcost in…,请使用:

with vvn as (select year, empid, sum(cost) as sc from orders group by year, empid) 
  select v1.year, v1.empid, v1.sc from vvn v1
    join (select year, max(sc) msc from vvn group by year) v2 
      on v1.year = v2.year and v1.sc = v2.msc;
顺便说一句,我的第一个答案的缩短版并不需要保持密集的排名部分,更简单的是:

select year, empid, sum_cost 
  from (select year, empid, sum(cost) sum_cost,
               max(sum(cost)) over (partition by year) max_cost
          from orders group by year, empid )
  where sum_cost = max_cost

已修改的版本保留。。。仍然有效且有趣,但您可能注意到了这一点。

如果在查询中使用自连接,通常会有一个基于分析函数的等价查询。 优点是,在大多数情况下,执行时间更短。在这里,您可以使用:

样本数据和输出:

create table orders (year number(4), empid number(5), cost number(10,2));
insert into orders values (2010, 1, 100);
insert into orders values (2010, 1, 115);
insert into orders values (2010, 1, 207);
insert into orders values (2010, 2, 104);
insert into orders values (2011, 1,  90);
insert into orders values (2011, 2,  15);
insert into orders values (2011, 2, 107);
insert into orders values (2011, 3, 100);
输出:

YEAR  EMPID  SUM_COST
----  -----  --------
2010      1       422
2011      2       122
编辑:如果你想在这里进行自连接,我怀疑你是否可以删除with子句。with特别是在使用复杂子查询两次或两次以上时使用。 如果您坚持加入,而不是像您在评论中所建议的那样,使用where year,tcost in…,请使用:

with vvn as (select year, empid, sum(cost) as sc from orders group by year, empid) 
  select v1.year, v1.empid, v1.sc from vvn v1
    join (select year, max(sc) msc from vvn group by year) v2 
      on v1.year = v2.year and v1.sc = v2.msc;
顺便说一句,我的第一个答案的缩短版并不需要保持密集的排名部分,更简单的是:

select year, empid, sum_cost 
  from (select year, empid, sum(cost) sum_cost,
               max(sum(cost)) over (partition by year) max_cost
          from orders group by year, empid )
  where sum_cost = max_cost

已修改的版本保留。。。仍然有效且有趣,但您可能注意到了这一点。

它不起作用…如下所示显示错误消息。。。。从中选择t1.year、t1.empid、sumt1.cost as total from orders as t1*第2行的错误:ORA-00907:如果我们在查询中删除t1和t2,则缺少右括号。BTB我正在使用Oracle Database 11g Express Edition 11.2.0.2.0版……那么,您的要求是什么,您在问题中没有提到。你的问题是‘有人能解释一下这有什么问题吗?’让我解释一下我的要求。。。。有一个名为ordersorderid、year、empid、cost的表…现在我想显示每年谁的账单最高。。。。首先,我使用此查询查找每个员工每年的总金额选择年份,empid,sumcost作为订单组中的年度合计,empid…接下来,我使用此查询查找每年的最大金额选择年份,每年从t1组中获取maxtotal…这里t1只是上面的查询而已…我不再重复查询,而是将其用作临时表,并将两者合并以获取empid。。。问题来了…请尝试选择年份,选择年份的maxtotal,empid,订单组的sumcost按年份为总计,empid按年份为sub_qry组它不工作…显示错误消息如下。。。。从中选择t1.year、t1.empid、sumt1.cost as total from orders as t1*第2行的错误:ORA-00907:如果我们在查询中删除t1和t2,则缺少右括号。BTB我正在使用Oracle Database 11g Express Edition 11.2.0.2.0版……那么,您的要求是什么,您在问题中没有提到。你的问题是‘有人能解释一下这有什么问题吗?’让我解释一下我的要求。。。。有一个名为ordersorderid、year、empid、cost的表…现在我想显示每年谁的账单最高。。。。首先,我使用此查询查找每个员工每年的总金额选择年份,empid,sumcost作为订单组中的年度合计,empid…接下来,我使用此查询查找每年的最大金额选择年份,每年从t1组中获取maxtotal…这里t1只是上面的查询而已…我不再重复查询,而是将其用作临时表,并将两者合并以获取empid。。。问题来了…请尝试选择年份,选择年份的maxtotal,empid,订单组的sumcost作为一年的总计,empid作为一年的sub_qry组由于错误,我放了逗号…我现在已经删除了…所以不能在另一个临时表中使用临时表名吗?比如在t2中提到t1。请建议是否有其他方式…但我不想重复t2中t1的全部代码…vvn为选择年份、empid、sumco
按年度计算vivek group的总成本,按年度计算empid select year,按年度计算empid,按vvn where year计算的总成本,按年度计算的总成本,按vvn group计算的最大总成本,按年度计算的订单;。。。。。这是实际的查询…在这里,我试图使用join和EXCLEATE WITH子句实现相同的结果…我错误地使用了逗号…我现在已经删除了…所以在另一个临时表中不可能使用临时表名吗?比如在t2中提到t1。请建议是否有其他方法…但我不想重复t2中t1的全部代码…vvn作为选择年份,empid,sumcost作为vivek group的tcost逐年,empid选择年份,empid,vvn的tcost其中年份,选择年份的tcost,vvn group的最大tcost逐年排序;。。。。。这是实际的查询…这里我尝试使用join和EXCLEATE WITH子句获得相同的结果…这是使用分析函数的一种方法…是否可以使用任何类型的join获得相同的结果?我们应该使用连接关键字…答案更新。希望这能结束话题或给出完整的线索。如果不是,这是家庭作业吗?第一个也是唯一的答案是使用分析函数-这里是sum和max。如果你的老师想用一些东西来连接答案-用dual连接1=1。但是,根据我的经验,老师们是对的。请提供完整的问题。这是使用分析函数的一种方法……是否可以使用任何类型的联接得到相同的结果?我们应该使用连接关键字…答案更新。希望这能结束话题或给出完整的线索。如果不是,这是家庭作业吗?第一个也是唯一的答案是使用分析函数-这里是sum和max。如果你的老师想用一些东西来连接答案-用dual连接1=1。但是,根据我的经验,老师们是对的。请提供完整的问题。