2017-08-24 24 views
3

我正在使用dplyrdbplyr包與我的數據庫進行交互。我有一張擁有數百萬條記錄的表格。我也有一個與我希望過濾的表中的鍵相對應的值列表。通常我會做這樣的事情來過濾表格。dplyr具有大量匹配的數據庫表

library(ROracle) 

# connect info omitted 
con <- dbConnect(...) 

# df with values - my_values 

con %>% tbl('MY_TABLE') %>% filter(FIELD %in% my_values$FIELD) 

但是,my_values對象包含了超過50萬項(所以爲什麼我在這裏不提供實際數據)。這顯然是無效的,當他們基本上被放在一個IN聲明(它基本上掛起)。通常,如果我正在編寫SQL,我會創建一個臨時表並編寫一個WHERE EXISTS子句。但在這種情況下,我沒有寫權限。

如何使此查詢在R中更高效?

+0

也許是一個內部連接? – rsmith54

回答

0

注知道這是否會幫助,但有幾個建議:

  1. 查找篩選其他條件。例如,如果my_values$FIELD是連續的,或者可以通過其他一些列推斷值的列表,則可以從between過濾器尋求幫助:filter(between(FIELD, a, b))
  2. 分而治之。拆分my_values分成小批,爲每批進行查詢,然後結合結果。這可能需要一段時間,但應該是穩定的,值得等待。
+0

感謝您的回覆,不幸的是,這些值不是連續的,所以選項1不存在。選項2應該工作,但我希望在這裏有其他的可能性。 – cdeterman

0

看你的限制,我想接近它類似於Polor啤酒如何建議,但我會用purrr::map值每發送一個DB命令,然後用dplyr::bindrows()末。通過這種方式,您將擁有一個不錯的管道代碼,如果您的列表發生更改,它將會適應。不理想,但除非您願意手動編寫SQL表變量,否則不確定任何其他解決方案。