2009-12-21 46 views
0

我想要使用的事实,在两个表t1t2我可以使用on t1.colum1>t2.colum2内部连接来计算返回向量的最大压差。问题是只有两个存储的数据库或表才能实现内部连接,而我只想选择一部分表。Sql =想要使用内部连接语句,但不与表

是否有任何其他的可能性,我是全新的SQL,我找不到任何其他选项?

谢谢

编辑

操控着我的内心之前加入到能够计算出我的最大跌幅我必须能够使这个内部连接上表选择,而不是表他们自己。所以我遵循马克的建议,但我仍然得到一个错误。这里是我的查询:

select * 
from (select * from bars where rownum <= 10 as x)as tab1 
inner join (select * from bars where rownum <= 10 as y) as tab2 
on tab1.x=tab2.y 

的错误是ora-00907 missing right parenthesis

  • 从发布为回答这个职位OP的消息中提取出的附加信息。 *
+0

哪个DB? MS SQL? – 2009-12-21 00:04:10

+0

桌子的结构是什么? – outis 2009-12-21 00:07:49

+0

马克=这是一个oracle db outis =你是什么意思的结构?我想要从中选择的表格有数百万行和大约10列 – user235693 2009-12-21 00:57:15

回答

0

(内部)连接不限于整个表格。

7

可以内部连接的子查询也是如此,你只是需要给子选择一个别名:

SELECT * 
FROM (SELECT 1 AS X) AS T1 
INNER JOIN (SELECT 1 AS Y) AS T2 
ON T1.X = T2.Y 

如果您发布非工作查询,我可以给你一个满意的答案更根据您的确切表。

+0

嗨马克,我做了这个查询,使用别名,但它返回了一个错误,说我没有找到表 – user235693 2009-12-21 00:57:46

+0

在工作中,我有没有办法安装类似于dbartisan和下载数据库所以我可以在家里训练?谢谢 – user235693 2009-12-21 00:58:37

+2

您是否可以更新问题以包含发生此错误的损坏查询?如果我能看到你到目前为止已经有多远,那么弄清楚你要去哪里错误要容易得多。 – 2009-12-21 01:00:01

0

我从an investment website(感谢Google!)得到了最大亏损的定义。所以我认为我们需要计算图表中最高点与其后的最低点之间的下降百分比。

以下查询计算过去12个月内Oracle股票投资的最大跌幅。它将investments表加入其自身,并使用别名来区分表格的版本(一个用于最高峰,一个用于最低谷)。这可能不会反映您的准确业务逻辑,但它会显示Oracle为您提供的SQL技术。

select round(((max_return-min_return)/max_return)*100, 2) as max_drawdown 
from 
    (select max(t1.return_amt) as max_return 
      , min(t2.return_amt) as min_return 
     from investments t1 
      join investments t2 
      on (t1.stock_id = 'ORCL' 
       and t2.stock_id = t1.stock_id 
       and t2.created_date > t1.created_date) 
     where t1.created_date >= add_months(sysdate, -12) 
     and t2.created_date >= add_months(sysdate, -12) 
    ) 
/

如果股票在窗口期间未经历下跌,则此查询将返回零。它也不检查下面的上升趋势(因为我知道缩进它应该是谷底,一旦股价再次上涨,我们只能建立一个点)。

关于家庭培训,我们可以从Oracle TechNet下载该软件。如果带宽或磁盘空间是Express Edition的问题,它没有所有的功能,但你可能暂时不会需要它们。 Oracle提供免费的IDE,SQL Developer。顾名思义它主要针对开发人员,但它具有许多DB Artisan的面向DBA的功能。对于全数据库管理,Oracle提供Enterprise Manager

编辑

在评论outis表明

你可以在加入作为未成年人 优化添加t1.return_amt > t2.return_amt

我认为这是不可能的,return_amt会索引,所以我认为这样的条款不太可能会影响业绩。它会做的是改变没有缩水的股票的行为。我提出的查询对于在整个时间窗口内持续增加的股票返回零。在这种情况下,额外的过滤器将返回NULL。更好的结果是味道(或需求规格)的问题。

+0

您可以在连接中添加't1.return_amt> t2.return_amt'作为次要优化。 – outis 2009-12-21 08:57:00

+0

在我看来,我不认为查询会起作用,因为'max(t1.return_amt)'可能来自不同于'min(t2.return_amt)'的行,这将撤销't2.created_date> t1.created_date'。相反,在内部select中尝试'max(t1.return_amt - t2.return_amt)'列。 – outis 2009-12-21 08:57:35

+0

由于默认连接是内部连接,因此在内部SELECT中没有没有缩进的股票会产生空的结果集,而不是具有NULL的行,从而导致外部SELECT也具有空的结果集? – outis 2009-12-23 15:32:54