【问题标题】:How to do an INNER JOIN in SSIS Excel Source component如何在 SSIS Excel Source 组件中进行 INNER JOIN
【发布时间】:2014-05-13 08:43:21
【问题描述】:
SELECT   [Sheet1$].ID,
CLng([Sheet1$].RecordID) AS RecordID, 
[Sheet1$].col1, 
[Sheet1$].col2, 
[Sheet1$].col3, 
[Sheet1$].col4, 
[Sheet1$].col5,
[Sheet2$].Name
FROM      [Sheet1$]
INNER JOIN [Sheet2$] ON 
[Sheet1$].RecordID = [Sheet2$].RecordID

我在 SSIS Excel 源组件中有上述示例 SQL 命令。从该查询中可以看出,我正在同一个工作簿中的两个 Excel 工作表(Sheet1 和 Sheet2)上进行内部连接。

此时查询执行良好,没有任何错误。

但是,我无法加入第三张表 (Sheet3)。当我尝试在 sheet3 上进行内部连接时,我收到以下错误消息。

一个 OLE DB 记录可用。来源:“Microsoft Access 数据库引擎”Hresult:0x80040E14 描述:“查询表达式 '[Sheet1$].RecordID = [Sheet2$].ReportID 中的语法错误(缺少运算符) 内连接 [Sheet3$] 开启 [Sheet1$].RecordID = [Sheet3$].RecordID'

所以我基本上无法在两个或多个 Excel 表上进行内部连接。我只能在一张 Excel 表上进行内部连接。我使用的语法在 SQL Server 中有效,所以我想知道 如果它也应该在 SSIS Excel 源 SQL 命令中工作,因为它似乎正在使用 Microsoft Access 数据库引擎。

下面是产生上述错误的第二个连接查询:

 SELECT   [Sheet1$].ID,
    CLng([Shee1$].RecordID) AS RecordID, 
    [Sheet1$].col1, 
    [Sheet1$].col2, 
    [Sheet1$].col3, 
    [Sheet1$].col4, 
    [Sheet1$].col5,
    [Sheet2$].Name
    FROM      [Sheet1$]
    INNER JOIN [Sheet2$] ON 
    [Sheet1$].RecordID = [Sheet2$].RecordID
    INNER JOIN [Sheet3$] ON 
    [Sheet1$].RecordID = [Sheet3$].RecordID

【问题讨论】:

  • CLng([Shee1$].RecordID) -> 不应该是CLng([Sheet1$].RecordID) 还是在这里发帖时打错字?
  • @shree.pat18,哦,这是一个错字,已更正。
  • 您能用 [Sheet3$] 尝试您的第一个查询吗?有用吗?
  • @PeterRing,是的,如果我删除 sheet2$ 并用 Sheet3$ 替换它,它会起作用。因此,只要我有一个内部连接,它就可以工作。只有在尝试添加第二个内部连接时才会失败。

标签: sql sql-server excel ssis


【解决方案1】:

好吧,我做错了。 SSIS Excel 源组件使用的 Microsoft access 数据库引擎处理连接的方式与 SQL Server 不同。

显然,你需要在 from 后面加上 n - 2 个左括号 每个新连接开始之前的子句和一个右括号 子句除了第一个,其中 n 是表的数量 结合在一起。

原因是Access的join语法只支持join两个 一张桌子,所以如果你需要加入两个以上,你需要 把多余的用括号括起来。

引自Access-SQL: Inner Join with multiple tables

并在http://office.microsoft.com/en-001/access-help/inner-join-operation-HA001231487.aspx确认

所以下面的查询现在可以工作了

SELECT   [Sheet1$].ID,
CLng([Shee1$].RecordID) AS RecordID, 
[Sheet1$].col1, 
[Sheet1$].col2, 
[Sheet1$].col3, 
[Sheet1$].col4, 
[Sheet1$].col5,
[Sheet2$].Name
FROM      (([Sheet1$])
INNER JOIN [Sheet2$] ON [Sheet1$].RecordID = [Sheet2$].RecordID)
INNER JOIN [Sheet3$] ON [Sheet1$].RecordID = [Sheet3$].RecordID

【讨论】:

    【解决方案2】:

    让我们尝试作弊:

    SELECT  
        CLng(x.RecordID) AS RecordID, 
        x.col1, 
        x.col2, 
        x.col3, 
        x.col4, 
        x.col5,
        x.Name
        FROM (
        SELECT
        [Sheet1$].RecordID, 
        [Sheet1$].col1, 
        [Sheet1$].col2, 
        [Sheet1$].col3, 
        [Sheet1$].col4, 
        [Sheet1$].col5,
        [Sheet2$].Name    
        FROM [Sheet1$]
        INNER JOIN [Sheet2$] ON 
        [Sheet1$].RecordID = [Sheet2$].RecordID
    ) as x
        INNER JOIN [Sheet3$] ON 
        x.RecordID = [Sheet3$].RecordID
    

    【讨论】:

      猜你喜欢
      • 2021-06-30
      • 1970-01-01
      • 2010-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-11
      相关资源
      最近更新 更多