【问题标题】:Putting the first table column (ID) last, without specifying the other table columns将第一个表列 (ID) 放在最后,而不指定其他表列
【发布时间】:2022-10-19 20:26:20
【问题描述】:

背景

我正在使用 R Studio 将 R 连接到 Microsoft SQL Server Management Studio。我正在将表格读入 R,如下所示:

library(sqldf)
library(DBI)
library(odbc)
library(data.table)

TableX <- dbGetQuery(con, statement = "SELECT * FROM [dim1].[dimA].[TableX]")

这对于某些表工作正常。但是对于大多数具有 binary ID 变量的表 发生以下情况:

TableA <- dbGetQuery(con, statement = "SELECT * FROM [dim1].[dimA].[TableA]")
Error in result_fetch(res@ptr, n) : 
  nanodbc/nanodbc.cpp:xxx: xxxxx: [Microsoft][ODBC SQL Server Driver]Invalid Descriptor Index 
Warning message:
In dbClearResult(rs) : Result already cleared

我发现问题是由第一列引起的,我可以这样选择:

TableA <- dbGetQuery(con, statement = "SELECT ID FROM [dim1].[dimA].[TableA]")

看起来如下:

AlwaysLearning 在 cmets 中提到这是一个反复出现的问题(123)。该查询仅在最后选择 ID 时有效:

TableA <- dbGetQuery(con, statement = "SELECT AEE, ID FROM [dim1].[dimA].[TableA]")

更新的问题

问题本质上是我如何才能在最后使用ID 变量的表中读取数据,而无需每次都指定所有表变量(因为这将是不可行的)。

可能的解决方法

我认为解决方法可能是选择 ID 作为整数:

TableA <- dbGetQuery(con, statement = "SELECT CAST(ID AS int), COL2 FROM [dim1].[dimA].[TableA]")

但是在这种情况下如何选择整个表?

我是一个 SQL 初学者,但我认为我可以通过使用类似这样的东西来解决它(来自this link):

TableA <- dbGetQuery(con, statement = "SELECT * EXCEPT(ID), SELECT CAST(ID AS int) FROM [[dim1].[dimA].[TableA]")

我选择除 ID 列之外的所有内容,然后选择最后的 ID 列。但是我建议的解决方案是不被接受的语法。

其他链接

java 的类似问题可以在 here 中找到。

【问题讨论】:

  • 你不是第一个encounterthisissue的人。您是否尝试过重新排序 SELECT 查询中的列以将二进制列放在末尾?
  • @AlwaysLearning 感谢您的评论。我浏览了链接,并将ID 列切换到最后一个确实有效。然而,问题是我仍然没有找到解决方案,如何在不指定表的所有列的情况下自动将ID 列放在最后。但是,我将使用此信息更新我的问题。谢谢你。

标签: r sql-server odbc sqldf


【解决方案1】:

我相信我已经找到了一种使用表别名满足您要求的解决方法。

通过将别名 C 分配给我要查询的表,它允许我选择特定列 ([ID]) 以及别名表中的所有列,而无需全部指定。

这将返回表的所有列(包括 ID 列)以及表末尾的 ID 列的副本。

然后我从结果表中删除 ID 列。

这将为您提供所需的结果:表中的所有列都按照它们出现的顺序排列,但位于末尾的 ID 列除外。

PS:为了完整起见,我提供了我自己的 DBIConnection 对象的模板。您可以将其替换为您自己的 DBIConnection 对象的细节。

library(sqldf)
library(DBI)
library(odbc)
library(data.table)

con <- dbConnect(odbc::odbc(),
                  .connection_string = 'driver={YourDriver};
                 server=YourServer;
                 database=YourDatabase;
                 Trusted_Connection=yes'
                  )

dataframe <- dbGetQuery(con, statement= 'SELECT T.*, T.[ID] FROM [SCHEMA_NAME].[TABLE_NAME] AS T')

dataframe_scoped <- dataframe[,-1]

【讨论】:

    猜你喜欢
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多