如何访问 R 中的嵌套 SQL 表?

Posted

技术标签:

【中文标题】如何访问 R 中的嵌套 SQL 表?【英文标题】:How do I access nested SQL tables in R? 【发布时间】:2020-02-05 22:13:47 【问题描述】:

从 R Studio 的 ODBC database documentation 我可以看到如何将 SQL 表读入 R 数据框的简单示例:

data <- dbReadTable(con, "flights")

让我将我正在尝试读取的BGBUref 表(?)的图形粘贴到 R 数据框。这是来自我在 R 工作室中的连接窗格。

如果我使用与上面相同的语法,其中con 是我的dbConnect(...) 的输出,我会得到以下信息:

df <- dbReadTable(con, "BGBURef")
#> Error: <SQL> 'SELECT * FROM "BGBURef"' nanodbc/nanodbc.cpp:1587: 42S02: 
#> [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Invalid object name
#> 'BGBURef'.

我对什么是“表格”的理解不正确吗?还是我需要做这样的事情才能到达嵌套的BGBUref 表:

df <- dbReadTable(con, "QnRStore\dbo\BGBURef")
#> Error: '\d' is an unrecognized escape in character string starting ""QnRStore\d"

如果我单击小电子表格图标,BGBUref 数据框将出现在 R Studio 中。我只是不知道如何将其放入定义的数据框中,在我的情况下为df


这是我运行这些命令时的输出:

df <- dbReadTable(con, "QnRStore")
#> Error: <SQL> 'SELECT * FROM "QnRStore"'
#> nanodbc/nanodbc.cpp:1587: 42S02: [Microsoft][ODBC Driver 17 for SQL 
#> Server][SQL Server]Invalid object name 'QnRStore'. 

和:

dbListTables(con)
#>  [1] "spt_fallback_db"                                         
#>  [2] "spt_fallback_dev"                                        
#>  [3] "spt_fallback_usg"                                        
#>  [4] "spt_monitor"                                             
#>  [5] "trace_xe_action_map"                                     
#>  [6] "trace_xe_event_map"                                      
#>  [7] "spt_values"                                              
#>  [8] "CHECK_CONSTRAINTS"                                       
#>  [9] "COLUMN_DOMAIN_USAGE"                                     
#> [10] "COLUMN_PRIVILEGES" 
#> ...
#> [650] "xml_schema_types"                                        
#> [651] "xml_schema_wildcard_namespaces"                          
#> [652] "xml_schema_wildcards"

【问题讨论】:

QnRStore 应该是dbConnect 函数的输出。 @David Browne - Microsoft 感谢第一个提示。我刚刚更新了问题以反映这些变化。任何额外的输入? 这不是“嵌套”表。这是一个名为“BGBUref”的表,位于名为 QnRStore 的数据库的默认模式“dbo”中。您发布的错误仍然显示“找不到对象 'QnRStore'”。对吗? dbListTables 输出什么? 那么您的 dbConnect 连接到错误的数据库。 【参考方案1】:

一般背景

首先,请考虑阅读关系数据库架构,其中表封装在架构中,架构本身封装在数据库中,然后封装在服务器或集群中。请注意图像中的图标对应于对象类型:

cluster/server < catalog/database < schema/namespace < table

因此,在您的情况下没有嵌套表,而是典型的架构:

myserver < QnRStore < dbo < BGBURef

要在 SQL 查询中从服务器级别访问此架构,您将使用句号限定名称:

SELECT * FROM database.schema.table

SELECT * FROM QnRStore.dbo.BGBURef

SQL Server 的默认架构是 dbo(相比之下 Postgres 是 public)。通常,像 R 的 odbc 这样的 DB-API 连接到允许连接到任何底层模式和相应表的数据库,假设连接的用户可以访问这些模式。请注意,此规则不可推广。例如,Oracle 的架构与所有者对齐,而 mysql 的数据库与架构同义。

查看进一步阅读:

What is the difference between a schema and a table and a database? Differences between Database and Schema using different databases? Difference between database and schema What's the difference between a catalog and a schema in a relational database? A database schema vs a database tablespace?

具体案例

因此,要连接到默认架构中的 SQL Server 数据库表,只需引用表 BGBURef,它假定该表位于连接数据库的 dbo 架构中。

df <- dbReadTable(con, "BGBURef")

如果您使用非默认架构,则需要相应地指定它,最近您可以使用 DBI::Id 执行此操作,并且可以类似地将其用于 dbReadTabledbWriteTable

s <- Id(schema = "myschema", table = "mytable")

df <- dbReadTable(con, s)

dbWriteTable(conn, s, mydataframe)

或者,您可以运行所需的期间限定 SQL 查询:

df <- dbGetQuery(con, "SELECT * FROM [myschema].[mytable]")

您可以使用SQL() 写入持久表:

dbWriteTable(con, SQL("myschema.mytable"), mydataframe)

【讨论】:

【参考方案2】:

当使用dbplyr 时,似乎

df = tbl(con, from = 'BGBUref')

如果大致相当于

USE QnRStore
GO

SELECT * FROM BGBUref;

来自@David_Browne 的评论和您拥有的图片:

名为“BGBUref”的表 在名为“dbo”的架构中 在名为“QnRStore”的数据库中

在这种情况下,您需要in_schema 命令。

如果您的连接 (con) 是到 QnRStore 数据库,那么试试这个:

df = tbl(con, from = in_schema('dbo', 'BGBUref'))

如果您的连接 (con) 不是直接连接到 QnRStore 数据库,那么这可能有效:

df = tbl(con, from = in_schema('QnRStore.dbo', 'BGBUref'))

(我在通过同一连接访问多个数据库时使用此表单。因为dbplyr 在连接不同数据库的表时使用同一连接时性能最佳。)

【讨论】:

以上是关于如何访问 R 中的嵌套 SQL 表?的主要内容,如果未能解决你的问题,请参考以下文章

在R中的嵌套变量中具有行百分比的expss表

如何将 R 数据框插入到 SQL Server 中的现有表中

如何在sql中创建嵌套表

如何将多层嵌套的json转换为sql表

如何在查询中取消嵌套嵌套表的集合?

如何在 Oracle SQL Developer 的存储过程中将表名列表作为参数传递?如何使用 PLSQL VARRAY 或嵌套表?