2014-07-22 43 views
0

我正在尋找一種方法來從相交的相反兩端表中的一個表中基於外鍵刪除交集表中的重複行表。爲了清楚起見,我會根據左側'tableA'的交集表中的外鍵值來說。根據外鍵列刪除交集表中的重複行的最佳方法

CREATE TABLE tableA 
    (
     link varchar(64) NOT NULL PRIMARY KEY, 
     name varchar(64) NOT NULL 
    ) 

    CREATE TABLE tableB 
    (
     link varchar(64) NOT NULL PRIMARY KEY, 
     name varchar(64) NOT NULL 
    ) 

    CREATE TABLE tableA_AND_tableB--Intersection Table 
    (
     link varchar(64) NOT NULL PRIMARY KEY, 
     LtableA varchar(64) references tableA(link), 
     LtableB varchar(64) references tableB(link) 
    ) 

基本上,我想基於'LtableA'外鍵字段刪除交集表中的所有重複行。例如:假設我在'tableA_AND_tableB'中有20個重複的'LtableA = id20140722',我該如何刪除'tableA_AND_tableB'中與'id20140722'匹配的所有行而不影響其他內容?

希望我的問題有道理。

+0

第1步 - 確定如何分辨一個副本,並要保留該行之間的差異。 –

+0

因此,如果tableA和tableB中都有一個id,那麼您希望從兩個表中刪除兩行,並且什麼也不留下? – Vulcronos

回答

1
Delete from tableA_AND_tableB where LtableA = 'id20140722' 

這將使用該ID刪除表中的所有行。或者,您可以看到this question以刪除所有重複內容。雖然答案會保留第一個或最後一個副本。

+0

不是很好的答案,但upvoted讓他的代表超過50,所以他可以發表評論,這應該是。 –

0

如果你想刪除重複的,但仍保持每行的一個獨特的副本:

WITH t AS (
    SELECT ROW_NUMBER() OVER(PARTITION BY LtableA, LtableB ORDER BY link) row_num 
    FROM tableA_AND_tableB 
) 
DELETE 
FROM t 
WHERE row_num > 1 
    AND LtableA = 'id20140722' 
相關問題