如何插入许多记录,不包括一些

时间:2013-07-11 13:44:06

标签: sql performance postgresql

我想创建一个包含主表中记录子集的表。 例如,我有:

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

我想存储peter和carl但不是jack,因为它有相同的peter代码。 我需要高性能,因为我有20M的记录。

我试试这个:

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

但不起作用。

3 个答案:

答案 0 :(得分: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 :(得分:1)

使用派生表,您可以找到每个代码的minID,然后再连接到外部的代码,从oldTab获取该ID的其余列。

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)

答案 2 :(得分: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