0

我一直在 Stack Overflow 和 Google 上进行一些搜索,但还没有找到我的问题的答案,所以我们开始吧:

自从我完成一个“从头开始”的数据仓库项目以来已经有一分钟了,所以我正在整理我过去的一些知识,但我正在为我的一个数据加载场景提供解决方案。

我正在创建一个事实表(factOrderLines),其中当然包含许多维度。我想链接到 factOrderLines 的维度之一是 dimItem。问题在于,根据项目的供应商和供应商部件号、制造商和制造商部件号或来自称为 ManagedItems (MngItemID) 的项目子集的标识符,项目是唯一的。

来源例如:

Vendor VendorPartNo 制造商 ManufacturerPartNo MngItemID
100 3456 空 空 67
100 3254 03 1234 23
空空 03 1235 24
无 无 15 5120 无

问题是当我从源表连接到 dimItem 表以填充 factOrderLines 表时,我有三个查找方案。这导致数字膨胀,性能变得可怕。

LEFT OUTER JOIN dimItem AS i ON  
    (i.Vendor = src.Vendor AND i.VendorPartNo = src.VndrItemID) OR  
    (i.Manufacturer = src.Manufacturer AND
    (i.ManufacturerPartNo = src.MfgItemID) OR (i.MngItemID = src.MngItemID)

对于这种情况,是否有比我开始实施的更有效/更好的方法?

编辑:完整的 INSERT 查询(为了更好地理解)

INSERT INTO fctOrderLine
           (PurchaseOrderKey
           ,DateKey
           ,PurchaseOrderLineNo
           ,VendorKey
           ,ManufacturerKey
           ,ItemKey
           ,UnitPrice
           ,Qty
           ,UnitOfMeasure
           ,LineTotal)
SELECT      PurchaseOrderKey    =   po.PurchaseOrderKey
           ,DateKey             =   ISNULL(c.DateKey, 19000101)
           ,PurchaseOrderLineNo =   ISNULL(p.POLineNbr, -1)
           ,VendorKey           =   ISNULL(v.VendorKey, -1)
           ,ManufacturerKey     =   ISNULL(m.ManufacturerKey, -1)
           ,ItemKey             =   ISNULL(i.ItemKey, -1)
           ,UnitPrice           =   ISNULL(p.UnitPrice, -1.00)
           ,Qty                 =   ISNULL(p.POQty, -1.00)
           ,UnitOfMeasure       =   ISNULL(p.ANSI_UOM, N'UNKNOWN')
           ,LineTotal           =   ISNULL(p.LineTotalCost, -1)
FROM        stgOrders AS p
INNER JOIN      dimPurchaseOrder AS po ON po.OrderNo = p.PONumber   
LEFT OUTER JOIN dimCalendar AS c ON c.Date = (CASE WHEN p.DT_PO IS NULL OR ISDATE(REPLACE(p.DT_PO, '''', '')) = 0 THEN CAST('19000101' AS DATETIME) ELSE REPLACE(p.DT_PO, '''', '') END)
LEFT OUTER JOIN dimVendor AS v ON v.VendorID = p.VendorID
LEFT OUTER JOIN dimManufacturer AS m ON m.ManufacturerID = p.MfgID
LEFT OUTER JOIN dimItem AS i ON (i.VendorKey = v.VendorKey AND i.VendorPartNo = p.VndrItemID) OR (i.ManufacturerKey = m.ManufacturerKey AND i.ManufacturerPartNo = p.MfgItemID) OR (i.MngItemID = p.MngItemID)
4

0 回答 0