T-SQL查找其他数据库中缺少的项目

时间:2016-09-06 05:40:27

标签: sql sql-server tsql

我有2个不同系统的数据库。 EDI系统 ERP系统如下

我想知道 EDI系统订单

中所有订单不在 ErpOrderItem 表中的所有ProductId
A. EDI System

Order
----
1. OrderId
2. OrderDate

OrderItems
---------
1. OrderItemId

2. OrderId

3. ProductId

Order_Erp
------
1. OrderId
2. ErpDocNum


ERP System


ErpOrder
-------
1. ErpDocNum
2. DocEntry

ErpOrderItem
----
1. DocEntry
2. ProductId

例如,我想知道OrderItems中的所有项目在ErpOrderItem中不可用于按订单键和ErpDocNum链接的订单。这两个系统由Order_Erp表中的ErpDocNum链接

我试过如下,但它没有给出我追求的结果。

select * from edi.Orders ODR
INNER JOIN edi.Order_Erp ERDR ON  ODR.OrderId = ERDR.OrderId
INNER JOIN edi.OrdersItems ODRL ON ODR.OrderId = ODRL.OrderId
INNER JOIN ErpOrder ON ERDR.ErpDocNum = ErpOrder.ErpDocNum
INNER JOIN ErpOrderItem ON ErpOrder.DocEntry = ErpOrderItem.DocEntry
where ErpOrder.ProductId != ODRL.Productid collate SQL_Latin1_General_CP1_CI_AS

2 个答案:

答案 0 :(得分:0)

根据提供的表格模式,您的on条件中提到的列是错误的(ON ERDR.ErpOrderNumber = ErpOrder.DocNum

SELECT * 
FROM edi.Orders ODR
  INNER JOIN edi.Order_Erp ERDR ON  ODR.OrderId = ERDR.OrderId
  INNER JOIN edi.OrdersItems ODRL ON ODR.OrderId = ODRL.OrderId
  INNER JOIN ErpOrder ON ERDR.ErpDocNum = ErpOrder.ErpDocNum
   INNER JOIN ErpOrderItem ON ErpOrder.DocEntry = ErpOrderItem.DocEntry
WHERE ErpOrder.ProductId != ODRL.Productid collate SQL_Latin1_General_CP1_CI_AS

答案 1 :(得分:0)

如果我正确理解您的问题,您所追求的是您的EDI系统中但不在ERP系统中的所有产品的列表?如果这就是你想要的,那么这应该是获得这些结果所需的全部内容。如果我没有正确理解您的要求,那么提供一个表格示例和预期结果通常会有所帮助

SELECT DISTINCT ProductID
FROM edi.OrderItems AS OI
WHERE NOT EXISTS
(
    SELECT 1
    FROM ErpOrderItem AS EOI
    WHERE OI.ProductID = EOI.ProductID
)