[英]SQL - Selection in one table based on matching values given in another table
在无休止地尝试处理R中的大型(3-35gb)csv文件之后,我已经转移到SQL来处理这些数据集。 所以我在R环境中使用这个代码(使用基于SQlite的RSQLite包),但它不应该减损我的SQL问题!
我的问题:如何根据另一个表中给出的匹配值选择一个表?
我想通过例子来解释。 我有以下表格格式:
“数据”表
Symbol| Value| EX
A | 1 | N
A | 1 | N
A | 2 | T
A | 3 | N
A | 4 | N
A | 5 | N
B | 1 | P
B | 2 | P
B | 2 | N
B | 2 | N
B | 3 | P
B | 5 | P
B | 6 | T
...
我想根据下面示例表中给出的特定条件选择符号和交换值匹配的所有条目。
“Symbolexchange”表:
Ticker| Exchange
A | N
B | P
...
(注意符号和自动收报机是指相同的属性, EX和Exchange也指同一属性)
所以我的目标输出是它只保留给定交换的条目是N等:
Symbol| Value| EX
A | 1 | N
A | 1 | N
A | 3 | N
A | 4 | N
A | 5 | N
B | 1 | P
B | 2 | P
B | 3 | P
B | 5 | P
...
我能够通过两种方法做到这一点,虽然我对它们不太满意。
此方法将引用表添加到原始表旁边的列中,这是多余的。
SELECT *
FROM Data
INNER JOIN Symbolexchange
ON Data.EX=Symbolexchange.EXCHANGE
AND Data.SYMBOL=Symbolexchange.TICKER
此方法也可以直接完成工作,但速度比上述慢。
SELECT *
FROM Data
WHERE EX=(SELECT exchange FROM Symbolexchange WHERE ticker = SYMBOL)
是否有更好,更快的方式来编程? 由于我的数据集的大小,速度非常重要。 对我的代码的任何其他评论欢迎!
谢谢
您可以采取两项措施来提高绩效:
首先(最重要的是)向表中添加键或索引。 我不知道SQLite,但通常会有这样的命令:
CREATE INDEX DataIX1 ON Data(Symbol,EX)
你也想在另一张桌子上找一个:
CREATE INDEX SymbolExchangeIX1 ON Symbolexchange(Ticker,Exchange)
您可能需要在名称上输入“..”或“..”...
第二件事是,虽然您的第一个查询可能是您最好的方法,但您应该只返回您实际需要/想要的列:
SELECT Data.*
FROM Data
INNER JOIN Symbolexchange
ON Data.EX=Symbolexchange.EXCHANGE
AND Data.SYMBOL=Symbolexchange.TICKER
我不确定您是使用mysql还是MS SQL。 对于MS SQL,您可以通过向查询添加无锁来加快查询速度。
1)WITH(NOLOCK)
Select * from user with (NOLOCK)
要么
2)SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
select * from user a, class b where a.userid=b.userid
您可以参考下面讨论的主题。 WITH(NOLOCK)vs SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.