SQL 插入并 Select 多列?
SQL Insert into and Select multiple columns?
所以我有一个看起来像这样的 tables:
通讯:(拨打电话)
Timestamp FromIDNumber ToIDNumber GeneralLocation
2012-03-02 09:02:30 878 674 Grasslands
2012-03-02 11:30:01 456 213 Tundra
2012-03-02 07:02:12 789 654 Mountains
2012-03-02 08:06:08 458 789 Tundra
我想创建一个新的 table,它具有所有不同的 FromIDNumber
和 ToIDNumber
。
这是它的SQL Fiddle。
这个有效:
INSERT INTO CommIDTemp (`ID`)
SELECT DISTINCT Communication.FromIDNumber
FROM Communication
UNION DISTINCT
SELECT DISTINCT Communication.ToIDNumber
FROM Communication;
我得到了:
ID
878
456
789
674
213
654
365
但我想知道是否有更有效的方法,因为我拥有的数据集有数百万行并且我不知道 UNION DISTINCT
的性能。
我最初尝试过
INSERT INTO CommIDTemp (`ID`)
SELECT DISTINCT Communication.FromIDNumber
AND Communication.ToIDNumber
FROM Communication;
但这没有用...有没有其他方法可以更有效地做到这一点?我是 SQL 的新手,所以非常感谢任何帮助,谢谢!!
性能主要取决于 table 的索引方式。我看不到一次完成所有操作的方法,因此我建议在 FromIDNumber 和 ToIDNumber 上使用单独的索引。即使对于很多行,这也应该使联合中的每个语句都非常快。
您只需使用一个 DISTINCT
语句即可加快速度。每个DISTINCT
需要一个sort/temptable。您可以从每个语句中删除 DISTINCT
,而 UNION DISTINCT
将确保您获得不同的值。
INSERT INTO CommIDTemp (`ID`)
SELECT Communication.FromIDNumber
FROM Communication
UNION DISTINCT
SELECT Communication.ToIDNumber
FROM Communication;
旁注:UNION ALL
比 UNION DISTINCT
快,但根据您的要求,您需要 UNION DISTINCT
,可以简单地写成 UNION
。
第一件事:我没有使用这么大的 tables 的经验。所以你必须自己测试以下技巧,看看它们是否真的适用于你的情况:
1. 在源中创建索引table
确保 FromIDNumber
和 ToIDNumber
列都有索引,即
ALTER TABLE Communication ADD INDEX (FromIDNumber);
ALTER TABLE Communication ADD INDEX (ToIDNumber);
2. 尝试删除 DISTINCT
我无法为您的示例找到更快的查询,尽管您可以尝试不使用 DISTINCT
关键字的查询 - 根据定义仅使用 UNION
returns 不同的值。所以这个 SQL 给我们的结果与您当前的查询相同:
INSERT INTO CommIDTemp (`ID`)
SELECT FromIDNumber FROM Communication
UNION
SELECT ToIDNumberFROM Communication;
3. 在临时文件中使用主键 table
也可以尝试另一种方法,将 CommIDTemp.ID 列设置为主键并使用 INSERT IGNORE
- 如果您想经常更新 table 而不删除内容,这将特别有用:
CREATE TABLE CommIDTemp (ID INT PRIMARY KEY);
INSERT IGNORE INTO CommIDTemp (`ID`)
SELECT FromIDNumber FROM Communication
UNION
SELECT ToIDNumber FROM Communication;
所以我有一个看起来像这样的 tables:
通讯:(拨打电话)
Timestamp FromIDNumber ToIDNumber GeneralLocation
2012-03-02 09:02:30 878 674 Grasslands
2012-03-02 11:30:01 456 213 Tundra
2012-03-02 07:02:12 789 654 Mountains
2012-03-02 08:06:08 458 789 Tundra
我想创建一个新的 table,它具有所有不同的 FromIDNumber
和 ToIDNumber
。
这是它的SQL Fiddle。
这个有效:
INSERT INTO CommIDTemp (`ID`)
SELECT DISTINCT Communication.FromIDNumber
FROM Communication
UNION DISTINCT
SELECT DISTINCT Communication.ToIDNumber
FROM Communication;
我得到了:
ID
878
456
789
674
213
654
365
但我想知道是否有更有效的方法,因为我拥有的数据集有数百万行并且我不知道 UNION DISTINCT
的性能。
我最初尝试过
INSERT INTO CommIDTemp (`ID`)
SELECT DISTINCT Communication.FromIDNumber
AND Communication.ToIDNumber
FROM Communication;
但这没有用...有没有其他方法可以更有效地做到这一点?我是 SQL 的新手,所以非常感谢任何帮助,谢谢!!
性能主要取决于 table 的索引方式。我看不到一次完成所有操作的方法,因此我建议在 FromIDNumber 和 ToIDNumber 上使用单独的索引。即使对于很多行,这也应该使联合中的每个语句都非常快。
您只需使用一个 DISTINCT
语句即可加快速度。每个DISTINCT
需要一个sort/temptable。您可以从每个语句中删除 DISTINCT
,而 UNION DISTINCT
将确保您获得不同的值。
INSERT INTO CommIDTemp (`ID`)
SELECT Communication.FromIDNumber
FROM Communication
UNION DISTINCT
SELECT Communication.ToIDNumber
FROM Communication;
旁注:UNION ALL
比 UNION DISTINCT
快,但根据您的要求,您需要 UNION DISTINCT
,可以简单地写成 UNION
。
第一件事:我没有使用这么大的 tables 的经验。所以你必须自己测试以下技巧,看看它们是否真的适用于你的情况:
1. 在源中创建索引table
确保 FromIDNumber
和 ToIDNumber
列都有索引,即
ALTER TABLE Communication ADD INDEX (FromIDNumber);
ALTER TABLE Communication ADD INDEX (ToIDNumber);
2. 尝试删除 DISTINCT
我无法为您的示例找到更快的查询,尽管您可以尝试不使用 DISTINCT
关键字的查询 - 根据定义仅使用 UNION
returns 不同的值。所以这个 SQL 给我们的结果与您当前的查询相同:
INSERT INTO CommIDTemp (`ID`)
SELECT FromIDNumber FROM Communication
UNION
SELECT ToIDNumberFROM Communication;
3. 在临时文件中使用主键 table
也可以尝试另一种方法,将 CommIDTemp.ID 列设置为主键并使用 INSERT IGNORE
- 如果您想经常更新 table 而不删除内容,这将特别有用:
CREATE TABLE CommIDTemp (ID INT PRIMARY KEY);
INSERT IGNORE INTO CommIDTemp (`ID`)
SELECT FromIDNumber FROM Communication
UNION
SELECT ToIDNumber FROM Communication;