【问题标题】:dbplyr ambiguous column namedbplyr 不明确的列名
【发布时间】:2023-03-08 15:47:01
【问题描述】:

我正在使用ODBCdbplyr 加入两个相对简单的表。但是,我的加入密钥出现错误,它抛出了ambiguous column name error。 dplyr 连接通常不会发生这种情况,我不知道如何使用 a.key = b.key,使用 dbplyr

Error: nanodbc/nanodbc.cpp:1655: 42000: [Microsoft][ODBC SQL Server Driver][SQL Server]Ambiguous column name 'Calendar_key'.  [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared. 
<SQL> 'SELECT "Calendar_key", "Organization_key", "Product_Key", "Promotion_Key", "Shift_Key", "ETL_source_system_key", "Pack_Size", "Qty_Sold", "Inv_Unit_Qty", "Extended_Cost", "Extended_Purchase_Rebate", "Extended_Sales_Rebate", "Extended_Sales", "Ent_Source_Hdr_Key", "Ent_Source_Dtl_Key", "Day_Date", "Day_Of_Week_ID", "Day_Of_Week", "Holiday", "Type_Of_Day", "Calendar_Month_No", "Calendar_Month_Name", "Calendar_Qtr_No", "Calendar_Qtr_Desc", "Calendar_Year", "Fiscal_Week", "Fiscal_Period_No", "Fiscal_Period_Desc", "Fiscal_Year"
FROM "Item_Sales_Fact" AS "LHS"
LEFT JOIN "calendar" AS "RHS"
ON ("LHS"."Calendar_key" = "RHS"."calendar_key")

这是下面的代码块:我的连接被称为 con

con <- dbConnect(odbc(),
                 Driver = "SQL Server",
                 Server = "192.168.139.1",
                 Database = "pdi_warehouse_2304_01",
                 UID = XXXX,
                 PWD = XXXX,
                 Port = 1433)

item.sales <- tbl(con, "Item_Sales_Fact")
calendar <- tbl(con, "calendar")
organization <- tbl(con, "Organization")

test.df <- item.sales %>%
  left_join(calendar, by = c("Calendar_key" = "calendar_key")) %>%
  collect()

【问题讨论】:

  • 列名是否正确
  • 是的,除了这两个之外没有共享的列名,而且他们有奇怪的大写/小写的东西。
  • 不知道是不是因为key列名中的子字符串
  • 你不会这么认为,但问题是如何纠正它?我无法更改表中的列名。

标签: r odbc tidyverse dbplyr


【解决方案1】:

dbplyr 生成的SQL 不正确,因为Calendar_key 可以来自RHSLHS,因为SQL 不区分大小写,并且与R 相反并没有区别在Calendar_keycalendar_key 之间:

SELECT "Calendar_key", ...

问题似乎来自这样一个事实,虽然SQL 不区分大小写,但SQL Server 处理区分大小写的列名。

一种解决方法是重命名两个键之一以获得完全相同的区分大小写的名称:

item.sales <- tbl(con, "Item_Sales_Fact")
calendar <- tbl(con, "calendar") %>% rename(Calendar_key = calendar_key)

test.df <- item.sales %>%
  left_join(calendar, by = c("Calendar_key" = "Calendar_key")) %>%
  collect()

【讨论】:

  • @Jeremy R. Johnson,它回答了你的问题吗?
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 2018-01-21
  • 2020-11-28
  • 1970-01-01
  • 2017-04-09
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多