这本质上是一个关于根据另一个表中的信息将数据插入一个表中的问题。该数据库是使用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不存在,因此“客户”或“缺失”中都没有记录。
当客户的数据不完整时(例如,与客户4一样,仅缺少2个值或三个变量的值),表CUSTOMERS中已经有一条记录,而我不想任何改变。但是,当客户缺少所有三个变量的值时(与客户3、5和8一样),我想向V1,V2和V3中具有NULL的CUSTOMERS添加一条记录,以便该表如下所示。 / p>
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 ...但是如何使用它对客户进行所需的更改?
答案 0 :(得分: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
中。
答案 1 :(得分:0)
鉴于您是SQL的新手,因此我将建议您更改方法。通过使用一个存在数据的表,而另一个丢失数据的表,则使它变得更加复杂。我建议仅在所有客户在场的情况下维护一个const hash = {'Apple':2, 'Orange' :1 , 'Mango' : 2};
let max = 0;
let result = [];
Object.getOwnPropertyNames(hash).forEach(k => {
if (hash[k] > max) {
result = [k];
max = hash[k];
} else if (hash[k] === max) {
result.push(k);
}
});
console.log(result);
表。然后,如果您要查找例如某个CUSTOMERS
的自定义数据是否丢失,则可以使用以下简单查询:
V2
这种方法使您不必维护一个单独的表来记录丢失的内容。如果SELECT *
FROM CUSTOMERS
WHERE V2 IS NULL;
中没有数据,那么您已经知道它丢失了。