SQL - 基于另一个表中给出的匹配值在一个表中进行选择

时间:2013-10-30 16:16:07

标签: sql sqlite sqldf

在无休止地试图处理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)

有没有更好更快的方法来编程呢?由于我的数据集的大小,速度非常重要。欢迎任何其他关于我的代码的评论!

由于

2 个答案:

答案 0 :(得分:3)

您可以采取两项措施来提高绩效:

首先(最重要的是)向表中添加键或索引。我不知道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

答案 1 :(得分:-1)

我不确定您使用的是mysql还是MS SQL。 对于MS SQL,通过在查询中添加无锁来提高查询速度。

1)WITH(NOLOCK)

Select * from user with (NOLOCK)

OR

2)SET TRANSACTION ISOLATION LEVEL READ UNANMITTITT

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