>我有一个临时表,其中包含id
列和value
列:
| id | value |
我有一个表,它聚合了带有列g_id
和value
的数据:
| g_id | value |
临时表中的 id 按 id 本地排序,这里有 2 个示例:
temp_table 1
| id | value |
+----+--------+
| 1 | first |
| 2 | second |
| 3 | third |
temp_table 2
| id | value |
+----+-------+
| 2 | alpha |
| 3 | beta |
| 4 | gamma |
我想将临时表中的所有行插入到全局表中,同时对g_id进行全局排序。如果我在临时表 1 之前插入临时表 2,它应该是这样的:
global_table
| group_id | value |
+----------+--------+
| 1 | first |
| 2 | second |
| 3 | third |
| 4 | alpha |
| 5 | beta |
| 6 | gamma |
就我而言,如果连续数字之间有跳跃是可以的,如果同时完成 2 个插入,则可以交错。要求基本上是 id 列总是在增加。
例如 假设我同时运行了 2 组查询,并且 global_table 中的group_id是自动递增的:
查询 1:
INSERT INTO global_table (value) VALUES (first)
INSERT INTO global_table (value) VALUES (second)
INSERT INTO global_table (value) VALUES (third)
查询 2:
INSERT INTO global_table (value) VALUES (alpha)
INSERT INTO global_table (value) VALUES (beta)
INSERT INTO global_table (value) VALUES (gamma)
我可以得到这样的东西:
global_table
| group_id | value |
+----------+--------+
| 1 | first |
| 3 | alpha |
| 4 | second |
| 5 | third |
| 6 | beta |
| 7 | gamma |
如何通过从表中插入来实现这样的事情?喜欢
INSERT INTO global_table (value)
SELECT t.value
FROM temp_table t
不幸的是,这可能不会一直导致 id 递增。
要求基本上是 id 列始终 增加。
如果我理解正确,您应该在INSERT
语句中使用ORDER BY
。
INSERT INTO global_table (value)
SELECT t.value
FROM temp_table t
ORDER BY t.id;
在 SQL Server 中,如果包含ORDER BY t.id
,它将保证在global_table
表中生成的新 ID 将按指定的顺序排列。
我不知道其他数据库,但SQL ServerIDENTITY
有这样的保证。
使用您的示例数据,可以保证为值second
生成的group_id
将大于为值first
生成的值。价值third
的group_id
将大于价值second
。
它们可能不是连续的,但如果指定ORDER BY
,它们的相对顺序将被保留。
第二个表也是如此,即使您同时运行两个INSERT
语句也是如此。生成的group_id
可以在两个表之间交错,但将保证每个语句中的相对顺序。
请参阅我对类似问题的回答,其中包含更多技术细节和参考资料。