2013-10-30 65 views
3

在R中無數次嘗試處理大型(3-35gb)csv文件後,我已經轉移到SQL來處理這些數據集。所以我在R環境中使用這段代碼(使用基於SQlite的RSQLite包),但它不應該減少我的SQL問題!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交易所指的是同一屬性)

因此,我所瞄準的輸出是這樣,它只保留A條目交換是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) 

是否有更好更快的方式來編程嗎?由於我的數據集的大小,速度非常重要。任何其他意見我的代碼歡迎!

謝謝

+0

第二個sql語句只會匹配'EX'。你想要嗎?你不需要匹配'Symbol'和'Ticker'? – unlimit

+0

是的你是對的,我只想匹配基於表Symbolexchange的'EX'。因此,對於股票代碼A,我只想選擇Exchange爲N的行。對於股票代碼B,我只想選擇Exchange是P的行。 – Hugstime

+2

有兩個問題:1)這是什麼DBMS? (不同的性能建議差異很大),以及2)您是否在這些表中定義了任何鍵或索引? – RBarryYoung

回答

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

謝謝!我在R中對此進行了計時,這將我的代碼從9.74秒加速到0.40秒,用於我的數據分段。 – Hugstime

-1

我不確定您是否使用mysql或MS SQL。 對於MS SQL,您可以通過向查詢添加無鎖定來加快查詢速度。

1)(NOLOCK)

Select * from user with (NOLOCK) 

OR

2)設置事務隔離級別未提交讀

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

+0

這是一個非常糟糕的主意,如果表格設計正確,很少會使查詢更快。 – RBarryYoung

相關問題