rstudio笔记本的sql块中的sql临时表?

Posted

技术标签:

【中文标题】rstudio笔记本的sql块中的sql临时表?【英文标题】:sql temporary tables in rstudio notebook's sql chunks? 【发布时间】:2017-06-30 20:25:34 【问题描述】:

我正在尝试在 rstudio 的 sql 代码块中使用临时表。

一个例子:当我选择一个表并将其返回到一个 r 对象时,事情似乎正在工作:

```sql  ,  output.var="x",  connection='db'    
  SELECT count(*) n
    FROM origindb
```

当我尝试使用临时表进行任何操作时,似乎命令正在运行,但返回一个空的 r data.frame

```sql  ,  output.var="x",  connection='db'    
  SELECT count(*) n
    INTO #whatever
    FROM origindb

  SELECT *
   FROM #whatever
```

我的印象是 Rstudio notebook sql 块只是设置为进行一个查询。所以我的临时解决方案是在数据库的存储过程中创建表。然后我可以用一些简单的东西得到我想要的结果。我希望在 sql 代码块中有更多的灵活性。

我的数据库连接如下所示:

```r,echo=F
db <- DBI::dbConnect(odbc::odbc(),
                      driver = "SQL Server",
                      server = 'sql',
                      database = 'databasename')
```

【问题讨论】:

我认为这个问题与 DBI 将每个查询视为一个单独的事务并因此为每个查询生成一个新的 spid 有关。由于临时表不能跨 spid 存在,因此它不起作用。我很想知道是否有人对此有不涉及创建 R 对象的解决方案,因为我正在尝试做同样的事情并希望从 R Notebook 为 SQL Server 用户创建一个培训文档。 【参考方案1】:

像this question,如果你把它会工作

set nocount on

在你的块的顶部。当临时表为 handed back the rowcount 时,R 似乎会感到困惑。

【讨论】:

【参考方案2】:

我使用 CTE 实现了我的目标。只要您按照使用顺序定义 CTE,它就可以工作。这就像使用临时表有一个很大的例外。查询完成后,CTE 将消失,其中存在临时表,直到您 spid 被杀死(通常通过断开连接)。

WITH CTE_WHATEVER AS (
                       SELECT COUNT(*) n 
                       FROM origindb
                      ) 
      SELECT * 
      FROM CTE_WHATEVER

您也可以对多个临时表示例执行此操作

WITH CTE1 AS (
              SELECT 
                  STATE
                 ,COUNTY
                 ,COUNT(*) n 
              FROM origindb 
              GROUP BY 
                 STATE
                 ,COUNTY
              ),
     CTE2 AS (
              SELECT 
                 STATE
                 ,AVG(n)
                 ,COUNTY_AVG
              FROM CTE1 
              GROUP BY 
                 STATE
              )
SELECT * 
FROM CTE2 
WHERE COUNTY_AVG > 1000000

抱歉格式化。我不知道如何让回车在代码块中工作。

我希望这会有所帮助。

【讨论】:

【参考方案3】:

您可以在定义BEGINCOMMIT 子句的SQL 块中管理事务。例如:

BEGIN ;
CREATE TABLE foo (id varchar) ;
COMMENT ON TABLE foo IS 'Foo';
COMMIT ;

【讨论】:

以上是关于rstudio笔记本的sql块中的sql临时表?的主要内容,如果未能解决你的问题,请参考以下文章

ORA-01652 - 无法在表空间中将临时段扩展 4096 (oracle 10)

SQL学习笔记——临时表不同创建方式的区别

RStudio中的SQL查询无法正常工作(odbc)

mysql 临时表的建立和用途

通过 RODBC 通过 RStudio 运行 SQL 查询:如何处理哈希表?

如何处理 pl/sql 块中的编译时异常?