我需要从另一个表更新一个表,我需要更新所有列。除了列出SET子句中的每一列之外,有没有办法一次更新它们?像这样:
update tableA
set * = tableB.*
from tableB where tableA.id = tableB.id
Run Code Online (Sandbox Code Playgroud)
我在 psql 中尝试过,它不起作用。我必须像这样列出每一列:
update tableA
set c1 = tableB.c1, c2 = tableB.c2, ...
from tableB where tableA.id = tableB.id
Run Code Online (Sandbox Code Playgroud)
tableB创建使用create .. like tableA. 所以它们基本上是相同的。我这样做的原因是我需要将 .csv 数据加载到临时表tableB,然后tableA根据.csv 中的新数据进行更新tableB。tableA需要尽量少加锁,tableA需要保持完整性。我不确定“删除然后插入”是否是一个不错的选择?
我有一张几百列宽的桌子。有没有办法将每一行转换为包含列标题的单个串联字符串,而不必列出查询中的每一列?
我这样做是因为列代表事件报告中的字段。我将它们重新组合在一起,以便人们可以以合乎逻辑的方式阅读报告。
我已经通过查询完成了其中的一些工作,但是为每一列都做起来很费力,而且似乎容易出错。
这是一个简短的片段,显示以我需要的格式连接的三列,在逐列方法中完成:
SELECT
Concat(
IIf(Id IS NULL, Null, Concat('Id: ' , [Id] , '\n') ) ,
IIf(StandardClientId IS NULL, Null,
Concat('StandardClientId: ' , [StandardClientId] , '\n') ) ,
IIf(ClientName IS NULL, Null,
Concat('ClientName: ' , [ClientName] , '\n') )
) AS ReportLine
FROM dbo.DataDecoded;
Run Code Online (Sandbox Code Playgroud)
谢谢
我想知道 PostgreSQL 是否有更新查询有点像他们的插入值语法。
我目前在此表单中有一组更新的数据:
INSERT INTO bought_in_control_panel(ID,PARENT_ID,BOUGHT_IN_FORM_TYPE_ID,PRIORITY,NAME,HEADING,DESCRIPTION,ICON,BOUGHT_IN_CONTROL_PANEL_FILE_ID)
VALUES(109,1,28,100,'Tooling','Tooling','Enter your Machine Tools here','tooling.png',null);
Run Code Online (Sandbox Code Playgroud)
并且我想将已有的行更新为新数据,我正在寻找类似以下内容的内容,我可以在其中更新所有行而无需重复自己:
UPDATE ON ID
bought_in_control_panel(ID,PARENT_ID,BOUGHT_IN_FORM_TYPE_ID,PRIORITY,NAME,HEADING,DESCRIPTION,ICON,BOUGHT_IN_CONTROL_PANEL_FILE_ID)
VALUES(
(109,1,28,100,'Tooling','Tooling','Enter your Machine Tools here','tooling.png',null),
(1,0,1,200,'Bought In','Bought In','','boughtin.png',null)
);
Run Code Online (Sandbox Code Playgroud)
以上将检查匹配ID值,并用新数据更新匹配。
注意:我真的希望避免手动映射所有列名。PostgreSQL 已经知道我的列,而且我已经将它们映射到数据上。为什么要以更长的格式再次这样做?