2012-03-10 95 views
0

我有4列设置基本上具有相同类型的数据。我想从所有列中所有条目的所有唯一条目创建另一个表。从所有列中选择唯一的列到一个列中

C1 (Name1)   C2 (name2)   C3 (name3) 
R1 R1 C1 (John)  R1 C2 (Tiny Tim) R1 C3 (Big Sally) 
R2 R2 C1 (Big Sally) R2 C2 (john)  R2 C3 (Paul) 
R3 R3 C1 (Tiny Tim) R3 C2 (paul)  R3 C3 (rajesh) 
R4 R4 C1 (Normal Ned) R4 C2 (Big Sally) R4 C3 (Normal Ned) 

这就是我需要

C1 
R1 John 
R2 Big Sally 
R3 Tiny Tim 
R4 Normal Ned 
R5 Rajesh 
R6 Paul 
+0

听起来很有趣。你有什么问题? – Hamish 2012-03-10 01:51:53

+0

你可以发布您的查询到目前为止? – 2012-03-10 02:00:22

+0

同一张桌子上的所有列吗? – Starx 2012-03-10 02:50:34

回答

2

可以使用UNION关键字做到这一点。

SELECT c1 FROM table 
UNION 
SELECT c2 FROM table 
UNION 
SELECT c3 FROM table; 

结果将如您所愿。

然后只需获取值并将其插入新表中,或者可以使用INSERT ... SELECT快速插入。

+0

INSERT INTO表2('column2')VALUES(选择C1 FROM表 UNION 选择C2 FROM表 UNION 选择C3 FROM表) 这不是工作 – 2012-03-10 02:24:03

+0

检查此链接[链接](HTTP://开发。 mysql.com/doc/refman/5.0/en/insert-select.html) – ChuyAMS 2012-03-10 02:51:23

2

如下尝试:

insert into newtablename 
    (
     select distinct uniquenames from (
      SELECT distinct c1 as uniquenames FROM tablename 
      UNION 
      SELECT distinct c2 as uniquenames FROM tablename 
      UNION 
      SELECT distinct c3 as uniquenames FROM tablename) 
    ) 
0

我能想到的最快方法是:

CREATE TABLE c_unique (c1 varchar(100 not null)); 
ALTER TABLE c_unique ADD UNIQUE INDEX (c1); 
INSERT IGNORE INTO c_unique(c1) SELECT c1 FROM table; 
INSERT IGNORE INTO c_unique(c1) SELECT c2 FROM table; 
INSERT IGNORE INTO c_unique(c1) SELECT c3 FROM table; 

使用UNION会隐给你独特的成果,并与排序以实现执行临时操作这个。通过使用INSERT IGNORE,您只需根据UNIQUE索引在INSERT操作上拒绝行,我认为这会更快。

注意: 在字符串列上使用UNIQUE将适用于特定字符长度。因此您可能必须指定前缀长度。您可以在这里阅读更多关于此主题的内容:CREATE INDEX语法

相关问题