Sql server 使用多列业务键查找填充事实表

Sql server 使用多列业务键查找填充事实表,sql-server,data-warehouse,star-schema,fact-table,Sql Server,Data Warehouse,Star Schema,Fact Table,我一直在搜索Stack Overflow和Google,但还没有找到我问题的答案,所以我们开始: 我已经有一分钟没有完成一个“从头开始”的数据仓库项目了,所以我正在整理我过去的一些知识,但我正在寻找一个数据加载场景的解决方案 我正在创建一个事实表(factOrderLines),当然有许多维度与之相连。我想链接到factOrderLines的维度之一是dimItem。问题在于,根据项目的供应商和供应商零件号、制造商和制造商零件号,或者来自称为ManagedItems(MngItemID)的项目子

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

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

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

资料来源举例:

Vendor VendorPartNo Manufacturer ManufacturerPartNo MngItemID 100 3456 NULL NULL 67 100 3254 03 1234 23 NULL NULL 03 1235 24 NULL NULL 15 5120 NULL 是否有比我已经开始实施的更有效/更好的方法来处理此场景

编辑:完整插入查询(以便更好地理解)


星型架构中的每个维度都需要有自己的代理键(无意义的autoinc int)。为什么不加入dimItem.ItemKey?@TabAlleman很抱歉,我刚刚编辑了这个问题,我并不是要包含ItemKey列,因为它不在源中。@User25563,根据这些新信息,初始注释仍然有效。星型模式方法规定每个事实和维度都需要有一个代理键,或无意义的自动递增整数。这就是您将加入事实表逻辑的内容。@user25563谢谢您的建议!我理解这一点,但如果源数据库表没有无意义或代理键。因此,当使用它作为源并查找维度以填充事实表的键时,这就是我的问题所涉及的部分。。。IE:从srcOrder左外部连接中选择dimA.progaterateKey,然后在dimA.businessKey=srcOrder.businessKey上连接dimA。。。这不是一般的做法吗?我可能错了:)
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 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)