Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
列a和列b不存在时的SQL删除_Sql - Fatal编程技术网

列a和列b不存在时的SQL删除

列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,

好的,你有这样的工作。您从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
但是发现一个问题,如果设备号以前属于不同的帐号,那么我以前的查询将插入一个新行,具有相同的设备号,但有一个新的帐号

我需要它做的很简单:

如果存在帐号和设备号,则不必插入。 如果设备编号存在,但已分配给其他帐号,请删除旧行。导入文件处理分配,因此我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)