我正在使用psql 8.4(不是升级的选项,但我不认为帽子应该为这个问题提供支持)。
我的关系:
BAY -- ID -- LOADER
124 -- 1B -- 5
124 -- 1C -- null
... ... ...
124 -- 1Z -- null
每个Bay都有多个ID,但每个ID将共享相同的Loader。有多个装载机,但永远不会有一个装有多个装载机的机架。这将是一个简单的更新声明:
update table set loader = '5' where bay = '124';
但是我如何为包含数百个Bays的整个桌子做到这一点?此外,我不知道哪个Bay映射到哪个加载器(即使它是一致的)。我只知道我需要为每个托架更新数百个新行。
我可以选择所有不同的托架及其相应的加载器,然后将其抛入VIM并创建一系列更新语句?但我很好奇另一个更优雅的方式在sql中用一个语句或只有几个做同样的事情?我的sql知识显然没有进步。
答案 0 :(得分:1)
如果每个托架只有一个加载器,并且至少有一个行已经有该加载器,则可以执行此操作:
update table set table.loader = (select b.loader from table b where b.bay = table.bay and b.loader is not null limit 1)
where table.loader is null
答案 1 :(得分:0)
试试这个,不会得到null加载器并把它放到null:
UPDATE T1 SET T1.Loader=T2.Loader FROM Table T1 LEFT JOIN Table T2 ON T1.bay=T2.Bay AND T2.Loader IS NOT NULL
答案 2 :(得分:0)
“每个海湾应该有相同的装载机”。这表明您的数据结构是错误的。你应该有一个包含托架的表。该表应包含加载程序信息。
您正在查看的表只会引用Bays
表并从那里获取加载程序信息。
如果您确实需要这样做,可以通过加入来实现:
UPDATE T1
SET T1.Loader = T2.Loader
FROM Table T1 JOIN
(SELECT t2.Bay, MAX(T2.Loader) as Loader
FROM Table T2
WHERE T2.Loader IS NOT NULL
GROUP BY t2.Bay
) tl
ON T1.bay = tl.Bay
WHERE T1.Loader IS NOT NULL;
这会为每个托架选择一个任意非NULL加载器,并使用它来分配给表中的NULL
Loader
。