2014-10-01 25 views
0

我有一個SQL表稱爲RawData有以下六列(所有類型VARCHAR):修改SQL表中插入從現有的行數據到上一行

NameStreetAddressStatePhoneWebsiteEmail

我定期從CSV文件導入新數據到該表中,並且99%的數據格式正確。對於1%的數據,由於我理解但對於此問題並不重要的原因,導入的數據使得所有前五列(Name,StreetAddressState,Phone,Website)具有格式正確的數據,但是第六列Email爲空。此外,電子郵件被導入到它自己的行中,緊挨着這個「問題」行下面,但是電子郵件被放置在Name列中。這些情況很容易識別開始電子郵件地址始終插入Name列與mailto:前綴。

我想要做的是設計一個查詢,從Name取下錯誤放置的電子郵件地址,去掉mailto:前綴,然後將其放入上一行的Email列。然後,我想在'Name'列中刪除包含'mailto:'電子郵件的行。

我已經做了一些研究,並且相信我需要使用遊標從正確行下方的行復制數據並將其插入到Email列中,但從未使用過遊標,我正在努力拿出任何東西。任何幫助,將不勝感激。

編輯:爲了簡潔起見,我省略了該表包含標識列ID

+0

你最好嘗試固定CSV導入問題,而不是嘗試修復它在DB端。 – Rahul 2014-10-01 21:54:22

+0

我無法解決這個問題,因爲我從我無法控制的來源接收CSV。 – zgall1 2014-10-02 03:11:07

回答

2

在SQL Server中,沒有「上一個」行的概念。您需要在表格中添加標識列,以便識別這些情況。幸運的是,您可以將數據插入到視圖中,因此身份會按加載順序自動遞增。

一旦你的ID,您可以使用更新:

update nd 
    set nd.email = stuff(ndnext.name, 1, 7, '') 
    from newdata nd join 
     newdata ndnext 
     on nd.id = ndnext.id - 1 
    where ndnext.name like 'mailto:%'; 

一旦您已經驗證這是正確的,你可能想要做:

delete nd from nd 
    where nd.name like 'mailto:%'; 
+0

爲了這個問題的目的,我省略了幾列,其中之一是我的身份。根據你的迴應,我現在看到這不是一個明智的決定。如果標識列存在,查詢將會是什麼樣子? – zgall1 2014-10-01 22:16:31

+0

@ zgall1。 。 。如果它是一個「身份」列,那麼它就像'id'一樣。如果是別的東西,我不知道它是如何將不同的行聯繫在一起的。你的問題沒有足夠的信息。 – 2014-10-01 22:22:47

+0

我誤解了聯接聲明。我想我明白了。對困惑感到抱歉。我會在早上嘗試您的查詢。 – zgall1 2014-10-02 03:11:53

相關問題