【问题标题】:Linking two instances of the same table in a query在查询中链接同一表的两个实例
【发布时间】:2019-11-25 09:41:05
【问题描述】:

我有一张销售订单表,该表与销售组织的货币和成本计算工厂相关联,该工厂可能使用不同的货币,也可能不使用不同的货币。我有一个汇率表,列出了不同货币对的汇率。我需要将汇率表链接到销售货币并单独链接到成本货币。当我尝试链接交换表两次时,我收到错误消息我收到此错误 -

对象“dbo.VW_CurrrentExchange”和“dbo.VW_CurrentExchange”在 FROM 子句具有相同的公开名称。使用相关名称 区分它们。

我尝试了两次链接表格,给表格一个额外的名称(就像在 Access 中一样,例如,dbo.VW_CurrentExchange_1)并简单地对 Access 中的内容进行建模。

select dbo.SalesOrderItems.DV, dbo.SalesOrderItems.SOrg, dbo.SalesOrderItems.SalesDoc, dbo.SalesOrderItems.item, dbo.SalesOrderItems.itca, dbo.SalesOrderItems.rj, dbo.SalesOrderItems.Createdon1 as ItemCreation, dbo.SalesOrderItems.[Sold-topt] as SoldTo, dbo.SalesOrderItems.OrderQuantity, dbo.SalesOrderItems.Cumulconfirmedqty as CCQSU,  dbo.SalesOrderItems.SU, dbo.SalesOrderItems.Cumulconfirmedqty1 as CCQBU, dbo.SalesOrderItems.BUn, dbo.SalesOrderItems.Material, dbo.SalesOrderItems.Plnt as Plant, dbo.SalesOrderItems.Reqdlvdt as RDD, dbo.SalesOrderItems.Netprice, dbo.SalesOrderItems.per, dbo.SalesOrderItems.RSD, dbo.SalesOrderItemStatus.DS , dbo.SalesOrderItemStatus.DS1 , dbo.SalesOrderItemStatus.DS2 , dbo.SalesOrderItemStatus.DS3, dbo.SalesOrderItemStatus.GM, dbo.SalesOrderItemStatus.OvCS, dbo.SalesOrderItemStatus.OS, dbo.SalesOrderItemStatus.DB, dbo.SalesOrderItemStatus.DB1, dbo.SalesOrderItemStatus.GS, dbo.SalesOrderItemStatus.BS, dbo.SalesOrderItemStatus.Rejectionstatus, dbo.customers.Name3, dbo.MARA.MaterialDescription, dbo.MARA.MatlGroup, dbo.MARC.ProfitCtr, dbo.VW_CurrentExchange.Exchange as PExch, dbl.VW_CurrentExchange.exchange as CExch           

from dbo.SalesOrderItems join  dbo.SalesOrderItemStatus on dbo.SalesOrderItems.salesdoc =  dbo.SalesOrderItemStatus.salesdoc and dbo.salesorderitems.item = SalesOrderItemStatus.item join dbo.VW_CurrentExchange on dbo.salesorderitems.curr = dbo.vw_currentexchange.Currency2 join dbo.customers on dbo.SalesOrderItems.[Sold-topt]=dbo.customers.Customer join dbo.MARA on dbo.SalesOrderItems.Material = dbo.MARA.Material join dbo.MARC on dbo.SalesOrderItems.Material = dbo.MARC.material and dbo.SalesOrderItems.plnt=dbo.MARC.Plnt join dbo.MBEW on dbo.SalesOrderItems.Material= dbo.MBEW.Material and dbo.SalesOrderItems.plnt=dbo.MBEW.ValA join dbo.Plants on dbo.SalesOrderItems.plnt = dbo.Plants.Plnt join dbo.VW_CurrentExchange on dbo.SalesOrderItems.curr = dbo.VW_CurrentExchange.Currency2

order by dbo.salesorderitems.Createdon1 desc

希望得到列出的字段,包括 PExch 和 CExch,但得到 Msg 1013,

16 级,状态 1,第 1 行对象 FROM 中的“dbo.VW_CurrentExchange”和“dbo.VW_CurrentExchange” 子句具有相同的公开名称。使用相关名称 区分它们。

【问题讨论】:

  • 请对表格使用不同的别名并尝试相同的代码
  • 您能否发布在您使用 VW_CurrentExchange_1 别名时不起作用的查询?

标签: sql-server ms-access migrate


【解决方案1】:

链接表两次是错误的做法。相反,正如 cmets 中的@indika-ranaweera 所建议的那样,您想要做的是在您的 SQL 中使用 SAME 链接表,但给它一个别名。

事实上,始终为您的表提供别名是一种很好的做法,并且可以真正读取您的 SQL,而不是依赖于 Access 提供的图形查询编辑器.

我用http://www.dpriver.com/pp/sqlformat.htm 重新格式化了你的SQL,添加了别名,对VW_CurrentExchange 的两种用途做了我希望是聪明的猜测,得到了以下结果:

SELECT SOI.dv, 
       SOI.sorg, 
       SOI.salesdoc, 
       SOI.item, 
       SOI.itca, 
       SOI.rj, 
       SOI.createdon1         AS ItemCreation, 
       SOI.[sold-topt]        AS SoldTo, 
       SOI.orderquantity, 
       SOI.cumulconfirmedqty  AS CCQSU, 
       SOI.su, 
       SOI.cumulconfirmedqty1 AS CCQBU, 
       SOI.bun, 
       SOI.material, 
       SOI.plnt               AS Plant, 
       SOI.reqdlvdt           AS RDD, 
       SOI.netprice, 
       SOI.per, 
       SOI.rsd, 
       SOIS.ds, 
       SOIS.ds1, 
       SOIS.ds2, 
       SOIS.ds3, 
       SOIS.gm, 
       SOIS.ovcs, 
       SOIS.os, 
       SOIS.db, 
       SOIS.db1, 
       SOIS.gs, 
       SOIS.bs, 
       SOIS.rejectionstatus, 
       C.name3, 
       MARA.materialdescription, 
       MARA.matlgroup, 
       MARC.profitctr, 
       VCE1.exchange        AS PExch, 
       VCE2.exchange        AS CExch 
FROM   dbo.salesorderitems AS SOI
       JOIN dbo.salesorderitemstatus AS SOIS
     ON SOI.salesdoc = SOIS.salesdoc 
        AND SOI.item = salesorderitemstatus.item 
       JOIN dbo.vw_currentexchange AS VCE1
     ON SOI.curr = VCE1.currency2 
       JOIN dbo.customers AS C
     ON SOI.[sold-topt] = C.customer 
       JOIN dbo.mara AS MARA
     ON SOI.material = MARA.material 
       JOIN dbo.marc AS MARC
     ON SOI.material = MARC.material 
        AND SOI.plnt = MARC.plnt 
       JOIN dbo.mbew AS MBEW
     ON SOI.material = MBEW.material 
        AND SOI.plnt = MBEW.vala 
       JOIN dbo.plants AS P
     ON SOI.plnt = P.plnt 
       JOIN dbo.vw_currentexchange AS VCE2
     ON SOI.curr = VCE2.currency2 
ORDER  BY SOI.createdon1 DESC 

编辑:查看我发布的内容后,我看不出您需要两份 vw_currentexchange 的原因。它们都通过相同的字段相关联(currcurrency2)。也许其中之一应该是currency1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 2016-04-12
    • 2013-06-13
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    相关资源
    最近更新 更多