2009-11-20 60 views
0

好的,所以你有这样的工作。您插入从tmp目录表,其中设备号码和帐号丢失一张桌子SQL删除当列a和列b不存在

Insert INTO ClientEquipments(
    SUB_ACCT_NO_SBB, 
    EquipmentDate, 
    EquipmentText, 
    EquipmentNumber) 
Select 
    replace(a.SUB_ACCT_NO_SBB,'"','') as SUB_ACCT_NO_SBB, 
    getdate() as edate,'' as etext, 
    replace(a.equipmentNumber,'"','') equipmentNumber 
from clientspaymenttemp a 
where not exists 
    (select b.equipmentNumber 
    from clientEquipments b 
    where b.sub_acct_no_sbb=replace(a.SUB_ACCT_NO_SBB,'"','') and b.equipmentNumber=replace(a.equipmentNumber,'"','')) 
group by SUB_ACCT_NO_SBB,equipmentNumber 

却发现一个问题,如果设备号码属于一个不同的帐户号码前,然后我以前的查询将插入一个新的行,使用相同的设备号码,但新的帐号。

我需要做的是简单的:

  1. 如果账户号码和设备号码存在,不管它不需要插入。
  2. 如果设备编号存在,但它被分配到一个不同的帐号,删除旧的行。

像这样在前面的代码添加的地方(让我100%肯定,它需要被分配到新帐户导入文件句柄分配):

DELETE FROM ClientEquipments 
WHERE  (clientEquipmentId = 
          (SELECT  clientEquipmentId 
          FROM   ClientEquipments AS ClientEquipments_1 
          WHERE  (equipmentNumber = '0CAEC6'))) 
  • 如果什么都不存在,则插入一个新行。
  • :::编辑一些更多的信息来帮助我:::

    我读一个CSV文件:

    样本数据:

    Account | Name | Address | Some Extra Stuff | Equipment Number 
    "1234","First1,Last1","Address 1",etc etc... "ENum1234" 
    "1234","First1,Last1","Address 1",etc etc... "ENum5678" 
    "5678","First2,Last2","Address 2",etc etc... "ENum9123" 
    "9123","First3,Last3","Address 3",etc etc... "ENum4567" 
    

    这被膨体导入到临时表中。 (dbo.clients_temp)

    请注意帐户1234有两个设备编号。

    在这里,我将新账户到dbo.clients做从dbo.clients_temp查询到dbo.clients

    然后我更新与dbo.clients_temp新的信息dbo.clients(即账户1234的威力,但存在现在他们有一个新的地址。)

    既然我的dbo.clients表更新了新的客户端,并为现有客户端提供了新信息,我需要更新我的dbo.equipments表。我原本是在做你上面看到的,插入不存在的帐号和设备号码。

    现在的问题是,由于设备会更改帐户,例如,帐户号码5678可能已变为不活动状态,我不会在数据库级别跟踪或关心,但设备号码现在可能属于帐户号码1234 。在这种情况下,我的原始查询将在数据库中插入一个新行,因为帐户1234和设备编号不会在SELECT中返回。

    好吧,我已经失去了这种现在:PI会尝试,后来重温上周末的问题,因为我只是我自己弄得乌

    +0

    现在我重读了几次就更有意义了。有没有什么办法可以先从给定的设备上运行删除操作,然后运行你在问题顶部的插入语句? 基本上,您将运行DELETE FROM ClientEquipments WHERE clientEquipmentId IN(SELECT EquipmentNumber FROM clientspaymenttemp)。因此,在加载新记录之前,您需要删除所有旧记录。然后,当您运行插入语句时,设备应与正确的帐户相关联。 只有一个问题,设备可以分配给多个帐户吗? – 2009-11-20 20:57:18

    +0

    啊,我明白你在说什么......但是有一个问题,那就是有一个日期字段,它被保存在同一张表中以跟踪设备注册的时间。如果有必要,我将不得不在周一仔细检查。不,每台设备都可以重新分配,但不会同时分配给多个客户端。 – jesusOmar 2009-11-21 19:47:36

    回答

    1

    我不得不修改了一下上面登的答案,但确实的伎俩...

    下面是删除非活动账户代码中的相关行。

    DELETE FROM ClientEquipments WHERE EquipmentNumber = 
    (SELECT E.equipmentNumber FROM ClientEquipments As E INNER JOIN ClientsPaymentTemp AS T 
    on E.equipmentNumber = T.equipmentNumber and e.SUB_ACCT_NO_SBB <> T.SUB_ACCT_NO_SBB) 
    
    +0

    很高兴听到你明白了。 – 2009-11-23 21:44:36

    0

    我可能是误会,但如果你正在寻找做的是删除记录帐号不相等的地方,并且设备号码等于某个东西,难道你不能只用一个条件删除多个条件吗?

    例子:

    DELETE FROM table 
    WHERE 
    equipmentNumber = someNumber AND 
    accountNumber <> someAccount 
    

    然后,您可以得到使用@@ROWCOUNT检查受影响的行数,然后插入如果没有删除受影响的行数。从以上在TechNet链接的示例使用了下面的例子:

    USE AdventureWorks; 
    GO 
    UPDATE HumanResources.Employee 
    SET Title = N'Executive' 
    WHERE NationalIDNumber = 123456789 
    IF @@ROWCOUNT = 0 
    PRINT 'Warning: No rows were updated'; 
    GO 
    

    我想你可以很容易适应,这样做你希望做什么。

    +0

    好吧,让我添加更多的信息,也许我们可以更好地理解这一点。我将添加到我原来的帖子。 – jesusOmar 2009-11-20 20:41:36

    +0

    好的。目前,这听起来像你想要做的是删除一行,其中设备编号被分配给不同的帐户,而不是它应该。如果分配给正确的帐号,则不执行任何操作。否则,如果设备编号不存在,请插入一个新行,其中包含与正确帐号关联的设备编号。 – 2009-11-20 20:46:29

    0
    -- Fix Account Numbers and Equipment Numbers 
    update ClientPaymentTemp 
    set SUB_ACCT_NO_SBB = replace(SUB_ACCT_NO_SBB,'"',''), 
    equipmentNumber = replace(equipmentNumber,'"','') 
    
    -- Delete Existing Accounts Mapped to New Equipment 
    delete e 
    from ClientEquipments e 
    inner join clientspaymenttemp t 
    on e.EquipmentNumber = t.EquipmentNumber 
    and e.SUB_ACCT_NO_SBB <> t.SUB_ACCT_NO_SBB 
    
    -- Insert New Accounts 
    insert into ClientEquipments 
    (SUB_ACCT_NO_SBB, 
        EquipmentDate, 
        EquipmentText, 
        EquipmentNumber) 
    Select 
        SUB_ACCT_NO_SBB, 
        getdate() as edate, 
        '' as etext, 
        equipmentNumber 
    from ClientsPaymentTemp a 
    where not exists (select 1 from ClientEquipments where SUB_ACCT_NO_SBB = a.SUB_ACCT_NO_SBB and EquipmentNumber = a.EquipmentNumber) 
    
    相关问题