Sql 通过联接从另一个表更新表的值会将所有值更改为一个值
我有三张表:原始销售、销售和详细信息。正在使用txt文件中的Sql 通过联接从另一个表更新表的值会将所有值更改为一个值,sql,postgresql,Sql,Postgresql,我有三张表:原始销售、销售和详细信息。正在使用txt文件中的COPY填充原始销售。原始销售中的所有字段都是字符串或文本。导入后,我们运行sql来填充销售和详细信息。详细信息中有一个外键(sale_id)。下面是一个示例INSERT命令,用于填充销售和详细信息 INSERT INTO sales (source, source_identifier) (SELECT DISTINCT 'FOO' AS source, "identifier" AS source_identifier
COPY
填充原始销售。原始销售中的所有字段都是字符串或文本。导入后,我们运行sql来填充销售和详细信息。详细信息中有一个外键(sale_id)。下面是一个示例INSERT
命令,用于填充销售和详细信息
INSERT INTO sales (source, source_identifier)
(SELECT DISTINCT
'FOO' AS source,
"identifier" AS source_identifier
FROM raw_sales
LEFT JOIN sales
ON sales.source_identifier = raw_sales.identifier
AND sales.source = 'FOO'
WHERE sales.id IS NULL
AND identifier IS NOT NULL);
INSERT INTO details (sale_id, description)
(SELECT DISTINCT
sales.id AS sale_id,
"improvements" as description
FROM raw_sales
JOIN sales
ON sales.source_identifier = raw_sales.identifier
AND sales.source = 'FOO'
LEFT JOIN details AS existing
ON existing.sale_id = sales.id
WHERE existing.id IS NULL
AND "improvements" != '');
这似乎很有效。在此之后,将运行另一个sql来更新现有表。查询如下
UPDATE details SET
description = "improvements"
FROM raw_sales
JOIN sales
ON sales.source_identifier = raw_sales.identifier
AND sales.source = 'FOO'
JOIN details AS existing
ON existing.sale_id = sales.id
WHERE existing.id IS NOT NULL;
此查询将详细信息表中的所有行更新为单个值,即原始销售表中的第一个非空值。如何更改上述sql,使其更新details表中的现有记录 您的查询有几个问题:
- 如果details.id是主键(字段id通常是主键),那么将其与notnull进行比较有什么意义?如果没有使用任何左连接,那么如果它确实是一个标识符,它就不可能为NULL
需要将表t与FROM部分中的某个内容链接,但您没有,因此表的每一行都将根据FROM结果更新为任意一个随机行更新表t集合。。。FROM…
UPDATE details SET
description = "improvements"
FROM raw_sales
JOIN sales ON (sales.source_identifier = raw_sales.identifier AND sales.source = 'FOO')
JOIN details AS existing ON (existing.sale_id = sales.id)
WHERE existing.id = details.id;
啊,我之所以将details.id与notnull进行比较,是为了只更新现有行(这是多余的,因为连接可以删除)。谢谢你的作品:)