Sql = 想要使用内部连接语句但不使用表
Posted
技术标签:
【中文标题】Sql = 想要使用内部连接语句但不使用表【英文标题】:Sql = want to use make an inner join statement but not with tables 【发布时间】:2009-12-21 00:03:04 【问题描述】:我想利用在t1
和t2
两个表上的事实,我可以与on t1.colum1>t2.colum2
进行内连接来计算返回向量的最大回撤。问题是内部连接只能使用两个存储的数据库或表,我想只选择表的一部分。
还有其他可能吗,我对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
【问题讨论】:
表的结构是什么? Mark = 那是一个 oracle db outis = 你说的结构到底是什么意思?我想从中选择的表有数百万行和大约 10 列 表结构(也称为“内涵”或“模式”)是表的元信息;它包括列名、列类型、默认值、外键和其他约束。基本上,我想要您用来创建表的语句(尽管信息不需要是有效的 SQL)。 outis 我有这一切在工作,如果你不介意我明天告诉你谢谢:) 当然。获得信息后,将其编辑到问题中。 【参考方案1】:你也可以对子选择进行内部连接,你只需要给子选择一个别名:
SELECT *
FROM (SELECT 1 AS X) AS T1
INNER JOIN (SELECT 1 AS Y) AS T2
ON T1.X = T2.Y
如果您发布无效查询,我可以为您提供更适合您的确切表格的更好答案。
【讨论】:
嗨,马克,我使用别名进行了此查询,但它返回一个错误,提示找不到表 顺便说一句,我在工作中这样做了,有没有办法安装类似于 dbartisan 的东西并下载一个数据库,这样我就可以在家训练了?谢谢 您能否更新问题以包含出现此错误的损坏查询?如果我能看到你到目前为止已经走了多远,就更容易找出你哪里出错了。【参考方案2】:(内部)连接不限于整个表。
【讨论】:
【参考方案3】:我从an investment website 得到了最大回撤的定义(感谢 Google!)。所以我认为我们需要计算图表中的最高点与其随后的最低点之间的百分比下降。
以下查询计算过去十二个月内甲骨文股票投资的最大回撤。它将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。
编辑
在 cmets outis 中建议
您可以在联接中添加
t1.return_amt > t2.return_amt
作为未成年人 优化
我认为return_amt
不太可能被编入索引,因此我认为这样的子句不太可能对性能产生影响。它会做的是改变没有回撤的股票的行为。我提出的查询对于在时间窗口内连续增加的股票返回零。在这种情况下,附加过滤器将返回 NULL。哪个是更理想的结果是品味(或需求规范)的问题。
【讨论】:
您可以在连接中添加t1.return_amt > t2.return_amt
作为次要优化。
在我看来,我认为查询不会起作用,因为max(t1.return_amt)
可能来自与min(t2.return_amt)
不同的行,这会撤消t2.created_date > t1.created_date
。相反,请尝试在内部选择中使用 max(t1.return_amt - t2.return_amt)
列。
由于默认联接是内部联接,没有回撤的股票不会导致内部 SELECT 中的结果集为空,而不是带有 NULL 的行,从而导致外部 SELECT 也有一个空的结果集?
@Outis - 否,因为查询使用聚合函数,它总是返回一行。以上是关于Sql = 想要使用内部连接语句但不使用表的主要内容,如果未能解决你的问题,请参考以下文章
如何在使用两个内部连接并将表设置为连接时在 MySQL 中使用更新语句?
Mysql - 连接 - 返回太多行 - 每个连接表一个,但不想要那个