【问题标题】:SQL Delete When column a and column b does not existSQL 删除当列 a 和列 b 不存在时
【发布时间】:2009-11-24 04:50:51
【问题描述】:

好的,所以你有这样的工作。您从 tmp 表中插入到表中,其中缺少设备号和帐号...

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% 确定它需要分配给新帐户)

Something Like this 添加在之前的代码中:

DELETE FROM ClientEquipments
WHERE     (clientEquipmentId =
                          (SELECT     clientEquipmentId
                            FROM          ClientEquipments AS ClientEquipments_1
                            WHERE      (equipmentNumber = '0012345CAEC6')))
  1. 如果不存在,则插入新行。

:::编辑更多信息以帮助我:::

我正在读取一个 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 有 2 个设备编号。

从这里我通过从 dbo.clients_temp 到 dbo.clients 的查询将新帐户插入到 dbo.clients

然后我使用来自 dbo.clients_temp 的新信息更新 dbo.clients(即帐户 1234 可能存在,但现在他们有一个新地址。)

现在我的 dbo.clients 表已经更新了新客户,以及现有客户的新信息,我需要更新我的 dbo.equipments 表。我最初是在做你在上面看到的,在不存在的地方插入帐号和设备号。

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

好的,我现在已经失去了这个:P 我会尝试在周末晚些时候重新审视这个问题,因为我只是把自己弄糊涂了 O.o

【问题讨论】:

  • 现在我重新阅读了几次,这更有意义。有什么方法可以先从给定设备运行删除,然后运行问题顶部的插入语句?基本上,您将运行 DELETE FROM ClientEquipments WHERE clientEquipmentId IN (SELECT EquipmentNumber FROM clientspaymenttemp)。因此,您将在加载新记录之前删除所有旧记录。然后,当您运行插入语句时,设备应该与正确的帐户相关联。就一个问题,设备可以分配给多个账号吗?
  • 啊,我明白你在说什么...但是有一个问题,有一个日期字段,它保存在同一个表中以跟踪设备注册发生的时间.如果有必要,我将不得不在星期一仔细检查。不,每台设备都可以重新分配,但绝不会同时分配给多个客户。

标签: sql


【解决方案1】:

我不得不稍微修改一下 Gordon 的回答,但这成功了……

以下是删除非活动帐户的相关代码行。

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)

【讨论】:

  • 很高兴听到你想通了。
【解决方案2】:
-- 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)

【讨论】:

    【解决方案3】:

    我可能会误会,但是如果您要做的只是删除帐号不等于某事而设备编号等于某事的记录,您不能只执行删除多个什么条件?

    例子:

    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
    

    我认为你可以很容易地适应它来做你想做的事情。

    【讨论】:

    • 好吧,让我添加更多信息,也许我们都可以更好地理解这一点。我将添加到我的原始帖子中。
    • 好的。目前,听起来您正在尝试做的是删除设备编号分配给与应有的不同帐户的行。如果它分配给正确的帐号,则什么也不做。否则,如果设备号不存在,则插入一个新行,其中设备号与正确的帐号相关联。
    猜你喜欢
    • 1970-01-01
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 2022-12-16
    • 1970-01-01
    • 2016-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多