2013-07-11 2 views
1

Я хочу создать таблицу с подмножеством записей из главной таблицы. , например, у меня есть:Как вставить многие записи, за исключением некоторых

id name code 
1 peter 73 
2 carl 84 
3 jack 73 

Я хочу сохранить питер и Карлу, но не потому, что гнездо имеет код же сам Питер. Мне нужна высокая производительность, потому что у меня 20M записей.

Я стараюсь это:

SELECT id, name, DISTINCT(code) INTO new_tab 
FROM old_tab 
WHERE (conditions) 

, но не работают.

+3

Ваша первая проблема заключается в определении вашего тай-брейкера. Когда столкнулись с Питером и Джеком, зачем выбирать Питера над Джеком? Используете ли вы самый низкий идентификатор? Как только я узнаю тай-брейк. Я могу написать запрос. –

+0

Я хочу запись с min id. Благодарю. –

ответ

3

Предполагая, что вы хотите, чтобы выбрать строку с максимальным id на code, то это следует сделать это:

insert into new_tab (id, name, code) 
(SELECT id, name, code 
FROM 
(
    SELECT id, name, code, rank() as rnk OVER (PARTITION BY code ORDER BY id DESC) 
    FROM old_tab WHERE rnk = 1 
) 
) 

и минимальной id в коде, просто изменить порядок сортировки в ранге от DESC к ASC:

insert into new_tab (id, name, code) 
(SELECT id, name, code 
FROM 
(
    SELECT id, name, code, rank() as rnk OVER (PARTITION BY code ORDER BY id ASC) 
    FROM old_tab WHERE rnk = 1 
) 
) 
1

Используя производную таблицу, вы можете найти мини-код для каждого кода, а затем присоединиться к нему во внешнем, чтобы получить остальные столбцы для этого идентификатора из oldTab.

select id,name,code 
insert into newTabFROM 
from old_tab t inner join 
    (SELECT min(id) as minId, code 
    from old_tab group by code) x 
on t.id = x.minId 
WHERE (conditions) 
+0

Если предполагается создать новую таблицу, она должна быть 'в newTab' (избавиться от' insert'). Если это необходимо вставить в существующую таблицу, «вставить в» должна быть первая строка. –

0

Попробуйте это:

CREATE TABLE #Temp 
(
    ID INT, 
    Name VARCHAR(50), 
    Code INT 
) 

INSERT #Temp VALUES (1, 'Peter', 73) 
INSERT #Temp VALUES (2, 'Carl', 84) 
INSERT #Temp VALUES (3, 'Jack', 73) 

SELECT t2.ID, t2.Name, t2.Code 
FROM #Temp t2 
    JOIN (
     SELECT t.Code, MIN(t.ID) ID 
     FROM #temp t 
      JOIN (
       SELECT DISTINCT Code 
       FROM #Temp 
       ) d 
       ON t.Code = d.Code 
     GROUP BY t.Code 
      ) b 
    ON t2.ID = b.ID 
Смежные вопросы