达梦 insert into select
时间: 2025-01-03 16:41:08 浏览: 4
### 达梦数据库 `INSERT INTO SELECT` 示例及用法
#### 插入来自另一张表的数据
在达梦数据库中,可以利用 `INSERT INTO SELECT` 语法来高效地将一个表中的数据复制到另一个表里。这种做法非常适合于批量处理以及创建临时工作副本等情况。
```sql
-- 将source_table 表中的所有记录插入到 target_table 中
INSERT INTO target_table (column1, column2, ...)
SELECT source_column1, source_column2, ...
FROM source_table;
```
对于更复杂的条件过滤或转换需求,则可以在 `SELECT` 部分加入额外逻辑:
```sql
-- 只选择满足特定条件的行并执行插入操作
INSERT INTO target_table (column1, column2, ...)
SELECT source_column1, source_column2, ...
FROM source_table
WHERE condition_expression;[^2]
-- 对选定字段应用函数或其他计算后再插入目标表
INSERT INTO target_table (column1, column2, ...)
SELECT FUNCTION(source_column1), source_column2 * multiplier, ...
FROM source_table;
```
需要注意的是,在设计此类查询时要确保源表和目的表之间存在兼容性关系;也就是说,所选列的数量及其数据类型应当匹配目标表定义的要求。此外,如果涉及到跨库传输大量数据的话,建议提前评估性能影响,并考虑采用分区交换等优化策略。
#### 实际应用场景实例
假设有一个名为 `orders_archive` 的存档订单表格用于保存历史交易信息,而当前活跃业务则由 `orders_current` 负责管理。为了定期清理过期条目并将它们迁移至长期存储区,可编写如下 SQL 语句:
```sql
-- 把一年前已完成状态下的订单转移到档案库
INSERT INTO orders_archive (order_id, customer_name, order_date, status)
SELECT o.order_id, c.customer_name, o.order_date, 'ARCHIVED'
FROM orders_current AS o JOIN customers AS c ON o.customer_id = c.id
WHERE DATEDIFF(CURRENT_DATE(), o.order_date) >= 365 AND o.status = 'COMPLETED';
-- 清除已转移出去的老化记录
DELETE FROM orders_current WHERE EXISTS (
SELECT 1 FROM orders_archive a
WHERE a.order_id = orders_current.order_id);
```
上述脚本不仅实现了从现有活动集合向持久化仓库的安全过渡,还通过删除陈旧项保持了前台系统的精简运作。
阅读全文