SQL复制多条件选择

时间:2016-01-14 20:00:58

标签: sql sql-server duplicates

我正在尝试创建一个基于多个规则删除重复项的查询。

一些示例数据:

A栏:B栏:

One    Apple
One    Pear
Two    Apple
Two    Mango
Three  Pear
Four   Mango
Five   Plum
Six    Mango
Zero   Banana

基本上我一直在争论的是,我希望查询根据每列的重复项返回不同的对。这意味着如果A中存在重复,则根据列重复删除所有条目(例如,两个和两个将删除两个苹果,两个芒果)。 B的相同逻辑(例如苹果苹果和芒果芒果被取出)所以最终结果将是:

A栏:B栏:

Three   Pear

Zero    Banana
Five    Plum

任何指针都会很棒。我在SQL Server上。谢谢。

3 个答案:

答案 0 :(得分:0)

您可以重新加入桌面,然后选择没有匹配项的行(例如没有重复项)。

SELECT a, b
FROM my_table source
LEFT JOIN my_table a_dups
    ON source.a = a_dups.a
    AND source.b <> a_dups.b
LEFT JOIN my_table b_dups
    ON source.b = b_dups.b
    AND source.a <> b_dups.a
WHERE a_dups.a IS NULL
    AND b_dups.b IS NULL

键入这个外部IDE以赦免SQL错误,但希望能给你一个想法。

答案 1 :(得分:0)

这就是:

创建样本数据集:

cols

显示完整数据集:

CREATE TABLE #temp (ColumnA varchar(20), ColumnB varchar(20))
INSERT INTO #temp
VALUES('One','Apple'),
('One','Pear'),
('Two','Apple'),
('Two','Mango'),
('Three','Pear'),
('Four','Mango'),
('Five','Plum'),
('Six','Mango'),
('Zero','Banana');

enter image description here

使用带有patrition的Common Table表达式来识别两列中的重复项:

SELECT * FROM #temp;

显示以下结果:

    WITH CTE AS (SELECT *,ROW_NUMBER() OVER (PARTITION BY ColumnA ORDER BY ColumnA ) AS rn1, ROW_NUMBER() OVER (PARTITION BY ColumnB ORDER BY ColumnB ) AS rn2  FROM #temp)

SELECT * FROM CTE WHERE ColumnA NOT IN (SELECT ColumnA FROM CTE WHERE rn1 <> 1) AND ColumnB NOT IN (SELECT ColumnB FROM CTE WHERE rn2 <> 1)

enter image description here

答案 2 :(得分:0)

您可以使用窗口函数来获取每个字段的计数,然后只检查两者的计数是否为1。像这样:

SELECT ColumnA, ColumnB
FROM (
  SELECT ColumnA, ColumnB,
         COUNT(*) OVER (PARTITION BY ColumnA) as ACount,
         COUNT(*) OVER (PARTITION BY ColumnB) as BCount
  FROM TABLE
) X
WHERE ACount = 1 AND BCount = 1