2015-12-07 80 views
-1

我使用的是SSMS 2008R2,並且我有一張表,它有兩個uniqueidentifier列,它們是彼此的鏡像。我如何刪除重複的行?如何編寫查詢以刪除重複的行?

例如我有如下表:

ColA  ColB  ColC  ColD 
ABCD  EFGH  4   5 
EFGH  ABCD  5   4 

所以可樂COLB是兩個唯一標識符列,而COLC和冷屬於可樂COLB。所以,如果我打破了這個分解成獨立的事件,這看起來像:

ABCD -> 4 
EFGH -> 5 

如何列出所有這些信息只有一條線路,而不是兩個? 這是我想上面的樣子,而不是:

ColA ColB ColC ColD 
ABCD 4  EFGH 5 
+0

什麼是期望的輸出? – DarkKnight

+0

這聽起來像你不想刪除_remove_,即刪除任何東西,也沒有涉及重複的行。你能否改寫標題是一個更準確的smidge? – HABO

+0

你的編輯沒有意義。你想交換ColB和ColC的內容嗎? – ErikE

回答

1

如果只想隱藏剩下的大多是原封不動,你可以這樣做(讓他們在相同的順序排序的列與他們行之間的差異,使重複與DISTINCT被隱藏):

SELECT DISTINCT 
    t2.* 
FROM 
    dbo.YourTable t 
    CROSS APPLY (
     SELECT t.ColA, t.ColB, t.ColC, t.ColD WHERE t.ColA <= t.ColB 
     -- Note: this next SELECT has the columns in a different order! 
     UNION ALL SELECT t.ColB, t.ColA, t.ColD, t.ColC WHERE t.ColA > t.ColB 
    ) t2 
; 

這將無法正常工作,如果ColAColB可以有NULL值。

但似乎你想要做一個多列unpivot,其中ColA和ColC的關係與ColB和ColC沒有任何特別的關係(除了可能包含的一些關鍵列)是這樣的:

SELECT -- can do DISTINCT if you remove the Type column 
    c.Type, 
    c.Code, 
    c.Value 
FROM 
    dbo.YourTable t 
    CROSS APPLY (
     SELECT 'ColA', t.ColA, t.ColC 
     UNION ALL SELECT 'ColB', t.ColB, t.ColD 
    ) c (Type, Code, Value) 
; 

您不必放在Type列,但我認爲這將是有益的給你看如何增加它可以幫助保護您的數據的意義時,正確標準化。

沒有關於您的數據和您想要完成的更多信息,我無法提供更多指導。

我會認爲,如果您將多個獨立事件存儲在多個列中,那麼數據庫設計並不理想,需要進行規範化處理 - 這些數據應該存儲在行而不是列中,因爲我的第二個查詢會轉換數據至。

+0

非常感謝您的幫助,但實際上我只是想將所有這些信息都放在一條線上。我現在更新我的描述,告訴你我的意思是 – salvationishere

+0

當我運行上面的第二個查詢時,它給了我單獨的行而不是刪除重複項。 – salvationishere

+0

您是否嘗試過第一個查詢?它確實給出了一條......? – ErikE