这可能听起来很基本,而且经常被问到,但令我惊讶的是,这个问题经常只得到部分回答.

假设我有一个PostgreSQL数据库,它有一个名为"TABLE"的表,其中有一列名为"COMPALUATION"的列.此列当前填充为NULL.

我有所有的值来填充数据库之外的计算.假设这些值在一个用逗号分隔的字符串中.现在,我要构造一条SQL语句,该语句按照"计算"的所有值在这样的字符串中出现的顺序更改它们.

类似的问题在这里也被问过,互联网上有无数关于如何为数据库增值的教程,但它们总是建议:

UPDATE calculation FROM table SET calculation=value WHERE ... 

该命令的问题在于:(1)它需要一个不存在的WHERE条件(我们希望更新所有值,而不仅仅是符合特定条件的值).(2)假设只有一个值可供计算.因此,似乎建议我们必须为每一行调用一个查询.

问这个问题的人经常会被吸引到:

INSERT INTO table (calculation) VALUES ... 

这完全符合语法,但不起作用,因为列已经存在,行已经创建.

这是一个在SQL之外的简单操作.和其他语言通常能够将向量作为列追加到它们的表等价项中.或者,更好的做法是将列的内容替换为向量.我遗漏了什么?

编辑:一个更具体的例子:

假定数据库数据库中已存在名为"TABLE"的下列表

PKID name calculation
1 alfa NULL
2 beta NULL
3 theta NULL

我希望在计算字段中分别填充值"akdak"、"dndja"和"jsnajsna".以使:

PKID name calculation
1 alfa akdak
2 beta dndja
3 theta jsnajsna

在不引用WHERE子句中的PKID和NAME值的情况下,如何在单个SQL查询中执行此操作?

推荐答案

您希望执行一些操作,利用ROW_NUMBER()窗口函数根据订单在记录之间创建对应关系:

WITH ValueList(Calculation) AS (
    Values('akdak'),('dndja'),('jsnajna')
)
UPDATE MyTable
SET Calculation = V.Calculation
FROM (
    SELECT Name, ROW_NUMBER() OVER (ORDER BY Name)
    FROM MyTable
) T(Name, rownum)
JOIN (
    SELECT Calculation, ROW_NUMBER() OVER (ORDER BY Calculation)
    FROM ValueList
) V(Calculation, rownum)
ON T.rownum = V.rownum
WHERE MyTable.Name = T.Name

JOIN将会成功,因此值计数不需要与表中的记录匹配.额外的值将被忽略,额外记录的calculation列将保持为空.

注意:我将WHERE MyTable.Name = T.Name放在查询的末尾,但根据哪些列是UNIQUE和/或NOT NULL以及您想要的确切行为,您可能更喜欢使用WHERE MyTable.PKID = T.PKID.

Sql相关问答推荐

如何更改函数返回的列名?

GROUP BY和GROUP_CONCAT用于计算比赛排名

提高写密集型表的查询性能

从字符串中删除";1、";和";2,";,而不删除";11、";和";12、";

是否可以为表中的所有列生成散列值?

在SQL Server中设置关联对象的有效JSON格式

表函数的作用域和功能

将用户授予另一个用户不授予权限

SQL JSON_QUERY 使用列中的值构造 json 路径并接收错误

在同一列上迭代时计算持续时间

根据标识符将两行合并为一行

在 R 值的 SQL 块中显示值

如何根据创建日期查找两个表中最接近的记录?

错误:postgresql 中缺少表评级的 FROM 子句条目

为什么 get_json_object() 无法从存储在 Hive SQL 表中的 JSON 中提取值?

雅典娜弄错了操作顺序

如何仅在满足条件时才按顺序在 SQL 中计数?

查找具有相同连接列数据的所有记录

SQL Server Where 条件

从 JSON 数组中移除对象