如何从R

时间:2017-09-26 09:22:50

标签: mysql sql r

我是R的新手,我希望将我的SQL DB中的多个表与R合并。

问题不在于合并它们,而在于获取查询。我在DB中有很多名称相似的表(最后只有数字不同)。

现在我希望这些表中的数据在R中使用它们。我已经尝试从.txt文档中导入这些表名,这样可行。但我无法使用函数dbGetQuery(connection, "SELECT * FROM...")

使用with方法,因为它只允许实际的表名,不允许有多个名称的变量。

我试过了

dbGetQuery(connection, 
"SELECT * FROM INFORMATION_SCHEMA.tables WHERE TABLE_NAME LIKE '..._%'") 

但这只是表名,而不是那里的数据。

我希望任何人都能理解我的问题。

3 个答案:

答案 0 :(得分:0)

使用pastesprintf函数连接SQL查询:

dbGetQuery(connection, sprintf("select * from %s", table_name))

通过对从table_name查询获得的每个INFORMATION_SCHEMA.tables执行此操作,您将拥有表格' R中的数据。

答案 1 :(得分:0)

我不会在R中这样做,我会直接在Workbench中这样做。首先创建一个新表来保存合并的结果:

CREATE TABLE AllData (
    id INT NOT NULL PRIMARY KEY,
    col1 varchar(55),            -- replace with your actual column types
    col2 int,
    ...
 )

然后执行以下INSERT INTO ... SELECT

INSERT INTO AllData (col1, col2, col3, ..., colN)
SELECT col1, col2, col3, ..., colN
FROM table1
UNION ALL
SELECT col1, col2, col3, ..., colN
FROM table2
UNION ALL
...
SELECT col1, col2, col3, ..., colN
FROM tableM

以上假设每个M表都有相同的N列,但你必须自己填写空白。

答案 2 :(得分:0)

将所有表导入列表并在R中合并。(包括LIMIT 100用于测试目的)

tables <- dbGetQuery(con, {"
  SELECT concat(TABLE_SCHEMA,'.',TABLE_NAME) tab
  FROM INFORMATION_SCHEMA.tables 
  WHERE TABLE_NAME LIKE 'pattern%'"})$tab


data <- 
  lapply(tables, function(table){
    dbGetQuery(con, sprintf({"
      SELECT * 
      FROM %s
      LIMIT 100
      "}, table)
    )
})

library(magrittr);library(dplyr)
data %<>% bind_rows() 

或者如果想要将它保留在MySQL中,并且确保表具有相同的结构,则下面的函数返回查询哪个联合所有匹配pattern的表:

union_all_mysql <- function(pattern){
  tables <- dbGetQuery(con, sprintf({"
  SELECT concat(TABLE_SCHEMA,'.',TABLE_NAME) tab
    FROM INFORMATION_SCHEMA.tables
    WHERE TABLE_NAME LIKE '%s'"}, pattern)
  )$tab

  query <- 
    lapply(tables, function(table) 
      sprintf("select * from %s", table) ) %>%
    unlist


  paste(query,collapse=" union ")

}


union_all_mysql("users_%")