[英]SQL - Only select row that is not duplicated
我需要將數據從一個表傳輸到另一個表。 第二個表有一個主鍵約束(第一個沒有約束)。 它們具有相同的結構。 我想要的是從表A中選擇所有行並將其插入表B中,而不是重復行(如果一行是0重復,我只想采取我找到的第一行)
示例:
MyField1 (PK) | MyField2 (PK) | MyField3(PK) | MyField4 | MyField5
----------
1 | 'Test' | 'A1' | 'Data1' | 'Data1'
2 | 'Test1' | 'A2' | 'Data2' | 'Data2'
2 | 'Test1' | 'A2' | 'Data3' | 'Data3'
4 | 'Test2' | 'A3' | 'Data4' | 'Data4'
就像你看到的那樣,第二行和第三行有相同的pk鍵,但MyField4和MyField5中的數據不同。 所以,在這個例子中,我希望有第一,第二和第四行。 不是第三個,因為它是第二個的重復(即使MyField4和MyField5包含不同的數據)。
我怎么能用一個選擇呢?
謝謝
首先,您需要定義什么使行“第一”。 我將構成一個任意定義,您可以根據需要更改SQL。 對於這個例子,我假設“first”是MyField4的最低值,如果它們等於MyField5的最低值。 它還說明了所有5列相同的可能性。
SELECT DISTINCT
T1.MyField1,
T1.MyField2,
T1.MyField3,
T1.MyField4,
T1.MyField5
FROM
MyTable T1
LEFT OUTER JOIN MyTable T2 ON
T2.MyField1 = T1.MyField1 AND
T2.MyField2 = T1.MyField2 AND
T2.MyField3 = T1.MyField3 AND
(
T2.MyField4 > T1.MyField4 OR
(
T2.MyField4 = T1.MyField4 AND
T2.MyField5 > T1.MyField5
)
)
WHERE
T2.MyField1 IS NULL
如果您還想要考慮源表中沒有重復但在目標表中已存在的PK,那么您也需要考慮到這一點。
不知道你怎么知道你想要在新表中的第2行和第3行,但在mysql中你可以簡單地:
insert ignore into new_table (select * from old_table);
並且PK將不允許插入重復條目。
你的數據庫是什么? 在Oracle中你可以說
SELECT FROM your_table
WHERE rowid in
(SELECT MIN(rowid)
FROM your_table
GROUP BY MyField1, MyField2, MyField3);
請注意,有些不確定具有相同PK的哪一行將被視為“第一”。 如果您需要強制執行特定訂單,則需要對其他列進行其他排序。
這取決於你在尋找什么。
使用JOIN
+ WHERE NULL
, NOT IN
和NOT EXISTS
(包括性能)之間存在很大差異,這對於較大的數據集更為重要。
(參見NOT IN vs. NOT EXISTS vs. LEFT JOIN / IS NULL 。)
鏈接文章中顯示的三種方法非常簡單。
CREATE TABLE #A(
ID INTEGER IDENTITY,
[MyField1] [int] NULL,
[MyField2] [varchar](10) NULL,
[MyField3] [varchar](10) NULL,
[MyField4] [varchar](10) NULL,
[MyField5] [varchar](10) NULL
)
INSERT INTO #A (MyField1,MyField2,MyField3,MyField4,MyField5) SELECT * FROM A
insert into B
select MyField1,MyField2,MyField3,MyField4,MyField5 from #A a1
where not exists (select id from #A a2 where a2.MyField1 = a1.MyField1 and a2.ID < a1.ID)
DROP TABLE #A
要么
insert into b
select distinct * from a a1
where not exists (
select a2.MyField1 from a a2 where a1.MyField1 = a2.MyField1 and
(a1.MyField2 < a2.MyField2 or a1.MyField3 < a2.MyField3
or a1.MyField4 < a2.MyField5 or a1.MyField5 < a2.MyField5))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.