2009-11-20 59 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) 
    
    相關問題