【问题标题】:IBM i (AS400) to SQL Server table join syntaxIBM i (AS400) 到 SQL Server 表连接语法
【发布时间】:2015-07-20 14:06:41
【问题描述】:

我正在使用 Excel 连接通过 SQL Server 连接从 DB2 for IBM i (AS400) 查询客户合同,并尝试加入 SQL Server 表以确定合同到期日期和销售团队责任。

AS400 查询运行,但我在加入 SQL Server 表 ACCOUNT.dbo.CUSTOMER 时继续收到错误消息,但在联接中找不到对替代语法的引用。

[select  *
from openquery(
bpcsrpt_new,'
select s.SCID, s.SVER, s.CONTEXP, a.ACCTNAME, a.SALESTEAM

from AS400table1.contract c, AS400table1.subcontract s, ACCOUNT.dbo.CUSTOMER a

where c.cid=''Active''
and c.cid=s.scid
and c.cver=s.sver
and c.cid=a.acid')]

【问题讨论】:

    标签: sql-server join ibm-midrange


    【解决方案1】:

    那是行不通的。当您使用 openquery 时,该语句将被发送到远程机器。显然,ACCOUNT.dbo.CUSTOMER 不在远程 IBM i(又名 AS400)机器上。

    您可以直接在查询中使用 4 部分命名

    select s.SCID, s.SVER, s.CONTEXP, a.ACCTNAME, a.SALESTEAM
    from IBMILNKNAM.IBMIDBNAM.IBMILIBNAM.contract c
         , IBMILNKNAM.IBMIDBNAM.IBMILIBNAM.subcontract s
         , ACCOUNT.dbo.CUSTOMER a
    where c.cid='Active'
    and c.cid=s.scid
    and c.cver=s.sver
    and c.cid=a.acid
    

    但是请注意,SQL Server 将拉回完整的合同和分包表以在本地进行连接。

    如果您只对 IBM i 上大表的几行感兴趣,那么 Openquery 是一个更好的选择。如果我没记错的话,是这样的:(未测试)

    select  * 
    from (select * from Openquery(IBMIKNKNAM, 'select s.SCID, s.SVER, s.CONTEXP 
                                from contract c
                                     join subcontract s 
                                           on c.cid=s.scid
                                           and c.cver=s.sver
                               where c.cid=''Active'')) as rmt
          join ACCOUNT.dbo.CUSTOMER a on a.acid = rmt.cid
    

    【讨论】:

    • 谢谢查尔斯。您的第二个选项效果很好。
    • 很高兴听到...意味着我的记忆没有完全消失!还有一件事要添加...请注意,在第二个示例中,我使用的是显式连接,而不是您示例中的隐式连接。最佳实践是在FROM 中使用带有连接条件的显式连接,而不是在WHERE 中使用带有连接条件的隐式连接
    猜你喜欢
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-09-24
    • 2010-09-05
    相关资源
    最近更新 更多