SQL 条件插入数据。 SQLite
Posted
技术标签:
【中文标题】SQL 条件插入数据。 SQLite【英文标题】:SQL conditional insertion of data. SQLite 【发布时间】:2018-07-25 05:33:44 【问题描述】:这本质上是一个关于根据另一个表中的信息将数据插入到一个表中的问题。 db 是用 sqlite3 实现的。我是一个相对较新的 SQL 用户。
我有两个表,CUSTOMERS 和 MISSING,如下所示(空格表示 NULL)。
CUSTOMERS:
ID|V1|V2|V3
1|18|23|14
2| 7| |11
4| |14|
7|19|22|12
MISSING:
ID|V1|V2|V3
2| N| Y| N
3| Y| Y| Y
4| Y| N| Y
5| Y| Y| Y
8| Y| Y| Y
表 MISSING 指示表 CUSTOMERS 中的哪些客户 ID 没有记录某些变量的值。因此,例如,客户 2 缺少变量 V2 的值,但缺少 V1 或 V3 的值。同样,客户 3、5 和 8 缺少所有三个变量 V1、V2、V3 的值。请注意,客户 6 不存在,因此在 CUSTOMERS 或 MISSING 中都没有记录。
当客户缺少不完整的数据时(即,与客户 4 一样,仅缺少 2 或三个变量的值)表 CUSTOMERS 中已经有一条记录,我不想任何改变。但是,当客户缺少所有三个变量的值(如客户 3、5 和 8)时,我想在 V1、V2 和 V3 中向客户添加一条带有 NULL 的记录,以便表格如下所示。
CUSTOMERS:
ID|V1|V2|V3
1|18|23|14
2| 7| |11
3| | |
4| |14|
5| | |
6| | |
7|19|22|12
8| | |
我知道如何从 MISSING 中选择表明缺少 V1、V2 和 V3 信息的 ID ...但我如何使用它对 CUSTOMERS 进行所需的更改?
【问题讨论】:
【参考方案1】:你会使用insert . . . select
:
insert into customers (id, v1, v2, v3)
select m.id, null, null, null
from missing m
where m.v1 = 'Y' and m.v2 = 'Y' and m.v3 = 'Y';
也就是说,您应该修改您的数据模型。不需要表missing
;所有信息都在customers
。
【讨论】:
是的,他应该修改他的方法,但不,不是他需要的所有信息“都在 CUSTOMERS 中”(他提供的第一个版本)。您无法从中决定 [ID 为 3、5、8 的行应该存在,但 [ID 为 6 的行不应该存在。 正如我在之前的评论中所暗示的,我同意表 MISSING 是完全没有必要的。真正的问题是,鉴于我在评论中提到的两个 Excel 工作表,一个人如何最终得到想要的最终数据模型。为了复制,导入作为数据库中初始表提供的工作簿的表 1 和表 6 似乎是明智的,然后才创建更改其结构的方法。我很欣赏关于模型的 cmets,以及所发布的问题的解决方案(我花了一点时间来理解)。 当我试图自己解决这个问题时,我没有理解的关键是可以将常量作为名义上的东西来“选择”(它们不是真的!)表,如 Linnof 的 SELECT m.id, null, null, null 。【参考方案2】:鉴于您对 SQL 比较陌生,我将首先建议您更改方法。通过让一个表存在数据,而另一个表缺少数据,这会使事情变得更加复杂。我建议只维护一个所有客户都在场的CUSTOMERS
表。然后,如果您想查明,例如,自定义是否缺少 V2
的数据,您可以使用简单查询:
SELECT *
FROM CUSTOMERS
WHERE V2 IS NULL;
这种方法使您不必维护一个单独的表来记录丢失的内容。如果CUSTOMERS
中不存在数据,那么您已经知道它丢失了。
【讨论】:
我同意你的建议,但这些表格并不是我真正创造的。我正在构建一个基于澳大利亚统计局地区社会经济指数的 SQLite 数据库。在abs.gov.au/AUSSTATS/subscriber.nsf/… 的电子表格中,我的“客户”表实际上对应于“表 1”工作表,“缺失”对应于“表 6”工作表。如果我知道如何按照我的要求去做,我就会拥有你认为我应该拥有的那种桌子! 如果您正在“构建...数据库”,那么是的,这些表是“您创建的”。 CUSTOMERS 表和 MISSING 表都可以作为 Tim 在此处建议的表的视图获得。 @ErwinSmout 我也打算给出一个字面上的答案,但这将是很多工作并且涉及生成序列。以上是关于SQL 条件插入数据。 SQLite的主要内容,如果未能解决你的问题,请参考以下文章