sql - 如何使用 SQL 将一列数据添加到已填充的表中?
问题描述
我正在尝试建立一个回收箱。当我从表中删除一列时,我会将其中的所有数据推送到一个名为bin的特殊表中。稍后我希望能够重建此列并将其添加到具有随机数据和随机大小的现有表中。
例子:
我有两个看起来像这样的表:
Table1 bin
| columnA | columnB | | origin | columnC | columnD |
| ------- | ------- | | ------- | ------- | ------- |
| aa | 10 | | columnD | NULL | a |
| bb | 20 | | columnD | NULL | s |
| cc | 30 | | columnD | NULL | d |
| columnD | NULL | f |
| columnC | 100 | NULL |
| columnC | 200 | NULL |
现在我想要做的是将bin表中的 columnC 或 columnD 之类的列添加到Table1中,如下所示:
| columnA | columnB | columnC |
| ------- | ------- | ------- |
| aa | 10 | 100 |
| bb | 20 | 200 |
| cc | 30 | NULL |
| columnA | columnB | columnD |
| ------- | ------- | ------- |
| aa | 10 | a |
| bb | 20 | s |
| cc | 30 | d |
| NULL | NULL | f |
| columnA | columnB | columnC | columnD |
| ------- | ------- | ------- | ------- |
| aa | 10 | 100 | a |
| bb | 20 | 200 | s |
| cc | 30 | NULL | d |
| NULL | NULL | NULL | f |
我正在使用 Python 和 Sqlite 3.31.1 虽然我愿意更改我使用的版本,因为有些人建议这个版本不允许连接操作,所以不要让它成为障碍。
我知道我可以像这样从 bin 中提取一列:
SELECT columnC
FROM bin
WHERE origin='columnC'
但我不知道,如何将该列从它的第一个条目开始插入另一个表,并用 NULL 条目填充其余部分。
解决方案
确定bin
您将从哪一行中选择columnC
更新每一行的值的一种方法table1
是使用 2 个相关子查询,这些子查询计算每个表中rowid
小于当前的行数rowid
:
UPDATE table1 AS t1
SET columnC = (
SELECT b1.columnC
FROM bin AS b1
WHERE (SELECT COUNT(*) FROM bin b2 WHERE b2.rowid < b1.rowid) =
(SELECT COUNT(*) FROM table1 t2 WHERE t2.rowid < t1.rowid)
)
这种解决方案对于大型数据集可能不是最有效的,但是您使用的 SQLite 版本不支持连接,它会执行得更好。
请参阅演示。
推荐阅读
- python - python sqlite - 删除选定的记录
- oracle - ASP.NET MVC5 是否支持 Oracle 8i
- java - 调用循环函数时 Java 唯一代码生成失败
- iphone - 我的手机设置中有 200 多个这样的分析,谁能告诉我它们的意思?
- mysql - MySQL 以 5 分钟为间隔的订单块
- powerbi - 查找连接 Power BI 和 MySql 数据库的服务器名称时出现问题
- java - Spring Data Redis Repository 为过期条目返回 null
- android - JSON解析改造2
- gstreamer - 使用 gstreamer srtp 进行音频流式传输
- elasticsearch - Elasticsearch 日期聚合