sql查询 - 基于1个已知字段和1个未知字段进行更新

时间:2014-06-03 14:25:55

标签: sql postgresql

我正在使用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知识显然没有进步。

3 个答案:

答案 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