2013-07-26 8 views
0

Например теперь у меня есть таблица вроде этого:Выберите отличие от уникального столбца

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 

Как я могу это сделать?

В настоящее время я использую слияние, но в ситуации, что моя таблица миллионы записей очень медленно

+3

Если вы действительно имеют уникальный индекс/ограничение на (Col2, COL3) ваши данные таблицы находится в нерабочем состоянии, и у вас есть большая проблема на ваших руках. –

+0

Записи не должны иметь одинаковый уникальный индекс. Если они это сделают, это не уникальный индекс. Если вы просто хотите, чтобы вы выбрали одно значение для каждой уникальной комбинации Col2/Col3, вам нужно будет добавить какую запись вы хотите выбрать. По умолчанию «пропущенные» записи бессмысленны, данные, как предполагается, не заказываются каким-либо особым образом. – Sam

+0

Извините, моя ошибка, я отредактировал свой вопрос – user2500561

ответ

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 
+0

Выше данных просто пример, на самом деле это тип данных varchar, и это также не просто, как 1,2,3, как это – user2500561

+1

Это будет работать нормально varchar тоже, НО выше запрос может очень хорошо выбирать данные из разных записей. Это почти никогда не будет тем, что вы хотите. – Sam

+0

См. Обновление. Полностью согласен с @Sam. – Devart

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 
+0

Когда я удаляю уникальный индекс и вставляю все записи в новую таблицу, занимает всего 1 час, чтобы вставить 22 миллиона записей. Но если я использую сливание, мне нужно около 3 часов. Поэтому я чувствую, что это очень медленно :(Об этом вопросе Devart имеет хороший ответ, но с этим ответом мне приходится вставлять данные в временную таблицу, а затем снова вставлять в реальную таблицу. Я думаю, что она будет медленной – user2500561

+0

+1 - за хороший ответ – Devart

+0

У вас есть идеальный вариант для моей ситуации, Devart? – user2500561