我有一张这样的table:
ID | Flag
-----------
1 | True
1 | True
1 | NULL
1 | True
1 | NULL
2 | False
2 | False
2 | False
2 | NULL
2 | NULL
我想要这样的输出:
ID | Flag
-----------
1 | True
1 | True
1 | True
1 | True
1 | True
2 | False
2 | False
2 | False
2 | False
2 | False
我想用在不同记录中指定的值替换空值。有没有一种方法可以在一个update语句中实现呢?
4条答案
按热度按时间5hcedyr01#
一个选项使用相关子查询:
db小提琴演示:
tzdcorbm2#
你也可以使用
exists
:优势
exists
在具有聚合的子查询上是性能:查询可以在flag
这是真的。这是对上的索引的简单索引查找(id, flag)
.通过限制更新的行数,性能将得到更大的提高。这实际上意味着两种不同的说法:
这些可以组合成一个(更复杂的)语句,但是被更新的集合是不相交的。这将限制对需要更新的行的更新,并将子查询限制为简单的查找(假设在
(id, flag)
).nbnkbykc3#
所提供的答案满足您的样本数据,但仍可能使您缺少满意的答案。这是因为您的示例数据缺少几个重要集。如果您有以下数据,而不是当前的样本数据,或者除了当前的样本数据之外,会发生什么?
答案可能大不相同。
mum43rcc4#
假设(如您的样本数据所示):
不可能有相同的
id
与true
和false
在片场。否则,你就得决定怎么做。null
如果没有非空值,则值保持不变id
.这将为您提供最佳性能:
db<>在这里摆弄
子查询
t1
提取每个id的目标值一次。自
null
最后排序,它有效地获取每个元素的第一个非空值id
.false
排序前true
但这与案件无关,因为两者不可能同时存在id
. 请参见:将空值排序到表的末尾
按组选择每组中的第一行?
如果每行有很多行
id
,有更快的技术:按查询优化分组以检索每个用户的最新行
外部查询中添加的条件防止了所有no-op更新的发生,从而避免了主要的开销。只有在
null
价值实际上是变化的。请参见:如何(或如何)在多个列上选择distinct?