如何将两个列表组合后批量插入数据库表(避免手动编写大量INSERT语句)
如何将两个列表组合后批量插入数据库表(避免手动编写大量INSERT语句)
嘿,我太懂手动写几百条INSERT的痛苦了!完全没必要这么折腾,用SQL的交叉连接(CROSS JOIN)就能一次性搞定所有组合,一行核心语句就够了,给你捋捋具体怎么做:
方案一:一次性快速实现(无需额外建表)
如果只是临时操作,直接用**表值构造器(VALUES)**把两个列表写进SQL语句里,再通过CROSS JOIN自动生成所有配对组合:
INSERT INTO dbo.TableName (state, region, date, person) SELECT s.state_abbr, r.region_code, GETDATE(), 'SampleName' FROM -- 这里放你的35个州缩写列表 (VALUES ('AK'), ('AL'), ('AZ'), -- 把剩下的32个州缩写依次补在这里 ) AS s(state_abbr) CROSS JOIN -- 这里放你的10个非连续区域码列表 (VALUES ('02'), ('39'), ('44'), -- 把剩下的7个区域码依次补在这里 ) AS r(region_code);
原理很简单:CROSS JOIN会自动将第一个列表的每一条数据,和第二个列表的每一条数据进行配对,刚好生成35×10=350条你需要的组合数据。固定值GETDATE()和'SampleName'直接在SELECT语句里带上就行,不用重复写几百次。
方案二:可复用的持久化方案
如果这两个列表以后还会用到,或者数据量更大,建议先把数据存入临时表(或永久表),再进行交叉连接插入:
-- 第一步:创建临时表存储州缩写 CREATE TABLE #States (state_abbr CHAR(2)); INSERT INTO #States VALUES ('AK'), ('AL'), ('AZ'), /* 补全剩余州缩写 */; -- 第二步:创建临时表存储区域码 CREATE TABLE #Regions (region_code CHAR(2)); INSERT INTO #Regions VALUES ('02'), ('39'), ('44'), /* 补全剩余区域码 */; -- 第三步:交叉连接两个临时表,批量插入目标表 INSERT INTO dbo.TableName (state, region, date, person) SELECT s.state_abbr, r.region_code, GETDATE(), 'SampleName' FROM #States s CROSS JOIN #Regions r; -- 用完临时表可以删除(可选,临时表会在会话结束后自动消失) DROP TABLE #States; DROP TABLE #Regions;
为啥不用WHILE循环?
其实完全没必要用WHILE循环,交叉连接是SQL专门为这种“全组合配对”场景设计的语法,不仅代码更简洁,执行效率也比循环高得多——数据库引擎对这类集合操作的优化,远比对逐行循环的优化好。
内容来源于stack exchange
相关产品推荐
相关产品推荐

