列a和列b不存在时的SQL删除
好的,你有这样的工作。您从tmp表中插入一个表,其中缺少设备编号和帐号列a和列b不存在时的SQL删除,sql,Sql,好的,你有这样的工作。您从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,
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
但是发现一个问题,如果设备号以前属于不同的帐号,那么我以前的查询将插入一个新行,具有相同的设备号,但有一个新的帐号
我需要它做的很简单:
如果存在帐号和设备号,则不必插入。
如果设备编号存在,但已分配给其他帐号,请删除旧行。导入文件处理分配,因此我100%确定需要将其分配给新帐户
在前面的代码中添加了类似的内容:
DELETE FROM ClientEquipments
WHERE (clientEquipmentId =
(SELECT clientEquipmentId
FROM ClientEquipments AS ClientEquipments_1
WHERE (equipmentNumber = '0012345CAEC6')))
如果不存在任何内容,则插入新行。
::编辑更多信息以帮助我:::
我正在读取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\u temp查询dbo.clients,将新帐户插入dbo.clients
然后我用dbo.clients的新信息更新dbo.clients\u temp ie帐户1234可能存在,但现在它们有了新地址
既然我的dbo.clients表是用新客户机和现有客户机的新信息更新的,那么我需要更新我的dbo.clients表。我最初做的是你在上面看到的,插入不存在的帐号和设备号
现在的问题是,由于设备确实更改了帐户,例如,帐户编号5678可能已变为非活动状态,我在数据库级别不跟踪或关心该帐户,但设备编号现在可能属于帐户编号1234。在这种情况下,我的原始查询将在数据库中插入新行,因为SELECT中不会返回帐户1234和设备号
好的,我现在已经失去了这个:p我将在周末晚些时候尝试重新讨论这个问题,因为我把自己搞糊涂了O.O我可能会误解,但是如果你想做的只是删除一条记录,其中账号不等于某个东西,设备号等于某个东西,您不能只使用多个where条件执行删除吗 例如:
DELETE FROM table
WHERE
equipmentNumber = someNumber AND
accountNumber <> someAccount
我想你可以很容易地调整它来做你想做的事情。我不得不稍微修改一下戈登的答案,但这确实奏效了
-- 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)
下面是删除非活动帐户的相关代码行
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)
好吧,让我补充更多的信息,也许我们都能更好地理解这一点。我将添加到我原来的帖子中。好的。目前,您试图做的似乎是删除一行,其中设备编号分配给不同的帐户,而不是应该的帐户。如果它被分配到正确的帐号,什么也不做。否则,如果设备编号不存在,请插入一个与正确帐号关联的设备编号的新行。现在我重新阅读了几次,这就更有意义了。您是否可以先从给定设备运行delete,然后运行问题顶部的insert语句?基本上,您需要从ClientEquipments运行DELETE,其中clientEquipmentId在SelectEquipmentNumber fromClientsPaymentTemp中。因此,在加载新记录之前,您将删除所有旧记录。然后,当您运行insert语句时,设备应与正确的帐户相关联。只有一个问题,设备可以分配到多个帐户吗?啊,我明白你的意思。。。但有一个问题是,有一个日期字段,保存在同一个表中,用于跟踪设备注册发生的时间。如果有必要的话,我必须在星期一再检查一遍。不,每个设备都可以重新分配,但不会同时分配给一个以上的客户。很高兴听到你解决了这个问题。
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)