按唯一列选择不同

时间:2013-07-26 07:49:53

标签: sql-server distinct-values unique-index

例如,现在我有一个这样的表:

Col1      Col2  Col3    Col4
1         1     1       1
11        2     3       44
111       2     3       444
1111      3     3       3

我有另一个具有相同结构的表,除了它有一个唯一的索引包括Col2和Col3。所以,我想从第一个表中选择并插入第二个表,但跳过具有相同唯一索引的记录。所以我可以创建一个包含以下数据的新表:

Col1      Col2  Col3    Col4
1         1     1       1
11        2     3       44
1111      3     3       3

我该怎么做?

目前我正在使用Merge Into,但是在我的表有数百万条记录的情况下它非常慢

2 个答案:

答案 0 :(得分:3)

尝试此查询,没有唯一索引/约束 -

<强>查询:

DECLARE @temp TABLE
(
       Col1 VARCHAR(10)
     , Col2 VARCHAR(10)
     , Col3 VARCHAR(10)
     , Col4 VARCHAR(10)
)

INSERT INTO @temp (Col1, Col2, Col3, Col4)
VALUES 
     ('1',     '1', '1', '1'),
     ('11',    '2', '3', '44'),
     ('111',   '2', '3', '444'),
     ('1111',  '3', '3', '3')

SELECT
      Col1 = MIN(Col1)
    , Col2
    , Col3
    , Col4 = MIN(Col4)
FROM @temp
GROUP BY
      Col2
    , Col3

<强>输出:

Col1       Col2       Col3       Col4
---------- ---------- ---------- ----------
1          1          1          1
11         2          3          44
1111       3          3          3

答案 1 :(得分:3)

我怀疑你能比合并更好,但你可以尝试优化你的合并查询。也许发布您当前使用的查询?无论如何,在这种情况下,分析往往很快。例如,以下几行:

SELECT Col1, Col2, Col3, Col4
FROM (
    SELECT Col1,
           Col2,
           Col3,
           Col4,
           MIN(Col1) OVER (PARTITION BY COL2, COL3) AS MinCol1
    FROM someTable
) Temp
WHERE Col1 = MinCol1