2016-11-22 89 views
1

我有一個臨時表稱爲T_TEMP其中我有3個字段(VARCHAR)如下:插入無重複

id, number, name. 

我有稱爲T另一個表,其中我有3個域,一個與標識(它是的Sql Server 2008)稱爲id,另一個稱爲號碼和名稱。兩者都是varchars,id是int。

我嘗試了以下聲明:

Insert into T (number,name) select distinct number,name from T_TEMP 

儘管這樣的插入語句插入了所有行,即使是重複的行。特別是有42行重複的數據。

任何人都可以幫助我做一些陳述來做插入或刪除臨時表中的副本?

編輯

數據例如

ID  |   NUMBER  | NAME 

----------| -------------------- | --------- 

25613278 | XX111111111BB  | B2930 

25613279 | XX111111111BB  | G6336 

25613280 | XX111111111BB  | G2344 
+0

我已更新我的回答 –

+0

我再次更新。現在沒關係 –

回答

0

需要兩個NOT EXISTS條款。第一個表T_TEMP(所以你只能得到相同數字的第一行)。第二,因爲如果你運行多次這個查詢你保證沒有重複出現在主表(T)中。

試試這個:

INSERT INTO T (number, name) 
    SELECT tt.number, tt.name 
    FROM T_TEMP tt 
    WHERE NOT EXISTS(SELECT 'PREVIOUS' 
    FROM T_TEMP tt2 
    WHERE tt2.number = tt.number 
    AND tt2.name < tt.name) 
    AND NOT EXISTS(SELECT 'DUPLICATE' 
    FROM T t2 
    WHERE t2.number = tt.number) 
+0

我已經試過了,它有重複的行,但是我仔細閱讀了你的答案,我發現它確保不存在具有幾個值的行,但我需要的是數字不重複。例如,我有這個:NUMBER:1 NAME:yuio // NUMBER:1 NAME:peri。我只想插入其中一個。 – Maik

+0

我試過了,它不起作用。兩個表的選擇計數(*)是相同的:S – Maik

+0

@Maik:請發佈一組您的輸入數據 –

0

一種選擇是在numbername列添加一個唯一索引/約束:

CREATE UNIQUE INDEX u_index ON T (number, name) 

現在,如果你INSERT聲明將包括哪些是重複使用記錄尊重number,name他們將在數據庫級別被拒絕。

0

INSERT INTO T (NUMBER, NAME) SELECT NUMBER, NAME FROM T_TEMP GROUP BY NUMBER, NAME

0

最後,我有解決方案:

聲明

INSERT INTO T 
     (number,name) SELECT number,name 
    FROM (
       SELECT number,name, 
         ROW_NUMBER() OVER(PARTITION BY number ORDER BY id DESC) rn 
        FROM T_TEMP 
) a 
WHERE rn = 1 

說明

此語句確保僅取其中RN,這是自排COMPUT ed字段等於1.使用此where子句可確保避免重複。 RN字段由number計算,這是我希望是唯一的字段。 order by id Desc子句允許將min id值作爲unique number字段。

+0

嗨,但如果你運行兩次這個聲明,你有重複的行。嘗試 –

+0

是的,這是真的,但問題是要避免在第一次插入重複。理論上我不會再從臨時表中插入決賽桌。這是因爲是手動數據清理過程。 – Maik