2013-09-25 86 views
4

我想获取一个值为多次重复的列,并只将该值存储一次并存储起来以备后用,但同时我希望获得另一个值行作为不同的列。SELECT DISTINCT值和INSERT INTO表

A  B  C 
32263 123456 44 
32263 123456 45 
32263 123456 46 
32264 246802 44 
32263 246802 45 
32264 246802 46 
32265 369258 44 
32265 369258 45 
32265 369258 46 

A,B,C代表三列。现在忽略C。

我的问题是:我如何在此表中获取此信息并将其存储,以便稍后在脚本中使用它?

这里是我的尝试:

use databaseName 

select distinct A from tableName 
order by A 

结果是:

A 
32263 
32264 
32265 

我试图得到它也给我B的值。 (注意它并不重要,因为不管我选择什么A,对于给定的A,B的值都是相同的。)我们现在忽略C。

结果应该是:

A  B 
32263 123456 
32264 246802 
32265 369258 

现在,一旦我得到它像我想插入使用我从查询得到的值的行。这是其中C进来我想要做这样的事情:

use databaseName 

insert into tableName (A, B, C) 
values (32263, 123456, 47) 

当然,我不想直接把值有内部,而不是有一些类型的循环将通过每个周期我发现了3个不同的A值。

总之,我的表应该去从:

A  B  C 
32263 123456 44 
32263 123456 45 
32263 123456 46 
32264 246802 44 
32263 246802 45 
32264 246802 46 
32265 369258 44 
32265 369258 45 
32265 369258 46 

要:

A  B  C 
32263 123456 44 
32263 123456 45 
32263 123456 46 
32263 123456 47 - 
32264 246802 44 
32263 246802 45 
32264 246802 46 
32264 246802 47 - 
32265 369258 44 
32265 369258 45 
32265 369258 46 
32265 369258 47 - 

我把破折号新添加的行旁边帮你看到的变化。

我想我应该做一些类型的循环,将循环所有三个不同的A值,但我的问题是如何做到这一点?

谢谢你的时间。

+0

有一个在'32264'节中段一个错误的'32263'。 –

回答

8

您可以在此使用INSERT INTO... SELECT声明,

INSERT INTO tableName (A, B, C) 
SELECT A, B, MAX(C) + 1 
FROM tableName 
GROUP BY A, B 
+0

小提琴:http://sqlfiddle.com/#!6/be579/1/0 –

+1

非常有帮助,非常感谢! – JohnAtrik

0

如果我明白你正确地完成什么,你应该能够做到这一点:

INSERT INTO Table 
SELECT A, B, MAX(C) + 1 
FROM Table 
GROUP A, B 

这应该为每个d插入一行istinct组合AB以及增量C

0

这可以使用窗口函数来完成。

INSERT INTO TABLENAME (A, B, C) 
SELECT A, B, C + 1 
FROM(
select A, B, C, MAX(C) OVER(PARTITION BY A, B) AS MAXC 
FROM TABLENAME 
) AS NEW_ROWS 
WHERE C = MAXC 
+0

这会添加许多重复项,OP只需要每个分组1行。 –

+0

@GoatCO将我的查询更新为过滤器。大多数情况下,一群人将工作,直到你只想按A分组。只想介绍窗口功能,因为它们非常有用。 – Vulcronos

0

试试这个:

SELECT * INTO new_table FROM 
    (SELECT DISTINICT * FROM table_name) x