Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过联接从另一个表更新表的值会将所有值更改为一个值_Sql_Postgresql - Fatal编程技术网

Sql 通过联接从另一个表更新表的值会将所有值更改为一个值

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

我有三张表:原始销售、销售和详细信息。正在使用txt文件中的
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…
    需要将表t与FROM部分中的某个内容链接,但您没有,因此表的每一行都将根据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进行比较,是为了只更新现有行(这是多余的,因为连接可以删除)。谢谢你的作品:)