我是R的新手,我希望将我的SQL DB中的多个表与R合并。
问题不在于合并它们,而在于获取查询。我在DB中有很多名称相似的表(最后只有数字不同)。
现在我希望这些表中的数据在R中使用它们。我已经尝试从.txt文档中导入这些表名,这样可行。但我无法使用函数dbGetQuery(connection, "SELECT * FROM...")
使用with方法,因为它只允许实际的表名,不允许有多个名称的变量。
我试过了
dbGetQuery(connection,
"SELECT * FROM INFORMATION_SCHEMA.tables WHERE TABLE_NAME LIKE '..._%'")
但这只是表名,而不是那里的数据。
我希望任何人都能理解我的问题。
答案 0 :(得分:0)
使用paste
或sprintf
函数连接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_%")