[英]SQL Insert into and Select multiple columns?
所以我有一個看起來像這樣的表:
通訊:(已撥打電話)
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
我想創建一個具有所有不同的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還是很陌生,所以任何幫助將不勝感激,謝謝!!
性能主要取決於表的索引方式。 我看不到一種一次性完成所有操作的方法,因此我建議在FromIDNumber和ToIDNumber上使用單獨的索引。 即使在很多行中,這也應該使您的聯合中的每個語句都非常快。
您可以僅使用一個DISTINCT
語句來加快此過程。 每個DISTINCT
需要一個排序/臨時表。 您可以從每個語句中刪除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
。
第一件事:我沒有使用這張大桌子的經驗。 因此,您必須自己測試以下提示以了解它們是否確實在您的情況下起作用:
1.在源表中創建索引
確保FromIDNumber
和ToIDNumber
列均具有索引,即
ALTER TABLE Communication ADD INDEX (FromIDNumber);
ALTER TABLE Communication ADD INDEX (ToIDNumber);
2.嘗試刪除DISTINCT
我找不到適合您的示例的更快查詢,盡管您可以嘗試使用DISTINCT
關鍵字進行查詢-使用UNION
根據定義僅返回不同的值。 因此,此SQL給我們提供與您當前查詢相同的結果:
INSERT INTO CommIDTemp (`ID`)
SELECT FromIDNumber FROM Communication
UNION
SELECT ToIDNumberFROM Communication;
3.在臨時表中使用主鍵
還可以通過將CommIDTemp.ID列設置為主鍵並使用INSERT IGNORE
嘗試另一種方法-如果您要頻繁更新表而不刪除內容,則此方法特別有用:
CREATE TABLE CommIDTemp (ID INT PRIMARY KEY);
INSERT IGNORE INTO CommIDTemp (`ID`)
SELECT FromIDNumber FROM Communication
UNION
SELECT ToIDNumber FROM Communication;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.