首页 > 解决方案 > 如何使用 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 条目填充其余部分。

标签: sqlsqlite

解决方案


确定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 版本不支持连接,它会执行得更好。

请参阅演示


推荐阅读