在数据库中填充新表的最佳方法

时间:2018-07-14 01:31:16

标签: sql

我有一个问题,过去几个小时一直在努力。 (对我来说)这很复杂,我不希望有人为我做。我只需要正确的方向。

问题:我们已经将表(如下)添加到了数据库中,我需要根据DailyCosts表中已有的数据进行更新。棘手的部分是我需要使用DailyCosts.Notes并将其移动到PurchaseOrder.PoNumber。 Notes是我们当前拥有PONumber的地方。

我从下面的“插入”开始,在一个WellID上进行了测试。这是将记录从我们的DailyCosts表插入到新的PurchaseOrder表中:

Insert Into PurchaseOrder (PoNumber,WellId,JObID,ID)
Select Distinct Cast(Notes As nvarchar(20)), WellID, JOBID, 
DailyCosts.DailyCostID
From DailyCosts
Where WellID =  '24A-23'

它影响了1973行(注释位于Ntext中)

但是,我需要更新其他新表,因为我们需要在应用程序中查看实际的PONumber。

下一个插入操作是将记录从我们的DailyCost表和新的PurchaseOrder表(从上面)插入到名为PurchaseOrderDailyCost的新表中

Insert Into PurchaseOrderDailyCost (WellID, JobID, ReportNo, AccountCode, PurchaseOrderID,ID,DailyCostSeqNo, DailyCostID)
Select Distinct DailyCosts.WellID,DailyCosts.JobID,DailyCosts.ReportNo,DailyCosts.AccountCode,
PurchaseOrder.ID,NEWID(),0,DailyCosts.DailyCostID
From DailyCosts join
PurchaseOrder ON DailyCosts.WellID = PurchaseOrder.WellID
Where DailyCosts.WellID = '24A-23'

不幸的是,这产生了3,892,729条记录。注释字段每天包含相同的PONumber列表。这是设计使然,以便在现场输入数据的人员可以轻松地跟踪其PO编号。我们将Notes移至的新PONumber列将仅存储唯一的POnumber。我通过将NEWID()替换为DailyCostID和Join to ON DailyCosts.DailyCostID = PurchaseOrder.ID来修改了查询 受影响的1973行与第一个Insert相同。

下一个插入内容如下:

Insert Into PurchaseOrderAccount (WellID, JobID, PurchaseOrderID, ID, AccountCode)
Select PurchaseOrder.WellID, PurchaseOrder.JobID, PurchaseOrder.ID, PurchaseOrderDailyCost.DailyCostID,PurchaseOrderDailyCost.AccountCode 
From PurchaseOrder Inner Join
PurchaseOrderDailyCost ON PurchaseOrder.ID = PurchaseOrderDailyCost.DailyCostID
Where PurchaseOrder.WellID = '24A-23'

应用程序中的页面现在在正确的列中显示PONumber。一切看起来都像我想要的。 不幸的是,它将应用程序减慢到无法接受的水平。我需要弄清楚如何修改我的插入或删除重复的记录。问题在于存在多个外键约束。我在下面有更多信息供参考。

This shows the application after the inserts. These are all duplicate records that I am hoping to elminate

以下是我从供应商那里获得的有关表格的其他信息:

-- add a new purchase order
INSERT INTO PurchaseOrder
                         (WellID, JobID, ID, PONumber, Amount, Description)
VALUES        ('MyWell', 'MyJob', NEWID(), 'PO444444', 500.0, 'A new Purchase Order')

-- link a purchase order with id 'A356FBF4-A19B-4466-9E5C-20C5FD0E95C3' to a DailyCost record with SeqNo 0 and AccountCode 'MyAccount'
INSERT INTO PurchaseOrderDailyCost
                         (WellID, JobID, ReportNo, AccountCode, DailyCostSeqNo, PurchaseOrderID, ID)
VALUES        ('MyWell', 'MyJob', 4, 'MyAccount', 0, 'A356FBF4-A19B-4466-9E5C-20C5FD0E95C3', NEWID())

-- link a purchase order with id 'A356FBF4-A19B-4466-9E5C-20C5FD0E95C3' to an account code 'MyAccount'
-- (i.e. make it choosable from the DailyCost PO-column dropdown for any DailyCost record whose account code is 'MyAccount')
INSERT INTO PurchaseOrderAccount
                         (WellID, JobID, PurchaseOrderID, ID, AccountCode)
VALUES        ('MyWell', 'MyJob', 'A356FBF4-A19B-4466-9E5C-20C5FD0E95C3', NEWID(), 'MyAccount')

-- link a purchase order with id 'A356FBF4-A19B-4466-9E5C-20C5FD0E95C3' to an AFE No. 'MyAFENo'
-- (same behavior as with the account codes above)
INSERT INTO PurchaseOrderAFE
                         (WellID, JobID, PurchaseOrderID, ID, AFENo)
VALUES        ('MyWell', 'MyJob', 'A356FBF4-A19B-4466-9E5C-20C5FD0E95C3', NEWID(), 'MyAFENo')

1 个答案:

答案 0 :(得分:1)

事实证明,我错过了一些简单的加入原则。我越好,我似乎犯的愚蠢错误。基本上,在我第一次插入时,我没有包括Group By。加进去后,我的INSERT从1973年增加到93年。然后在我的下一个插入中,我加入了DailyCosts.PurchaseOrder.PONumber的注释,因为这些是我需要的DailyCosts中唯一的记录。这以前是我的问题上的INSERT 2。从那里基本上,一切都汇集到了一起。两步前进,后退一步。感谢所有对此做出回应的人。

相关问题