基于聚合记录集的SQL更新
我有一张有采购订单的桌子:基于聚合记录集的SQL更新,sql,sql-server,Sql,Sql Server,我有一张有采购订单的桌子: po_line table +--------+---------+-----------+ | po_num | po_line | date | +--------+---------+-----------+ | 1 | 1 | 9/22/2013 | | 1 | 2 | 9/22/2013 | | 1 | 3 | 9/22/2013 | | 2 | 1 | 9/2
po_line table
+--------+---------+-----------+
| po_num | po_line | date |
+--------+---------+-----------+
| 1 | 1 | 9/22/2013 |
| 1 | 2 | 9/22/2013 |
| 1 | 3 | 9/22/2013 |
| 2 | 1 | 9/21/2013 |
| 2 | 2 | NULL |
+--------+---------+-----------+
po table
+--------+-----------+
| po_num | confirmed |
+--------+-----------+
| 1 | NULL |
| 2 | NULL |
+--------+-----------+
对于给定的po,例如po_num 1,如果所有记录中都有这些行的日期,我想将表2中的值更新为“已确认”。示例1将填充已确认的。PO 2将不符合标准,因为第2行没有日期
我是否需要使用光标来执行此操作?运行sql 2008 r2。或者,如果要在确认之前确保
po行中的每个po
都有条目,可以使用:
UPDATE po SET confirmed = 'confirmed'
FROM po T
WHERE
NOT T.po_num IN
(
SELECT po_num FROM po_line
WHERE po_date IS NULL
)
update po set confirmed = 'confirmed'
where po.po_num in (select po_num from
(select po_num, count(po_date) dated, count(*) total from po_line group by po_num) q
where dated=total)
如中所示,您是否可以重新格式化示例数据集以正确渲染?这将有助于获得答案。编辑:谢谢汉克斯,这对汉克斯的建议帮助很大。今后我会记得检查类似的事情。由于采购订单记录是首先创建的,并且是采购订单行的父项,因此这些应始终具有值。不过,我喜欢将两者的总数进行比较。太好了。我想做一些平均值,但效果很好。唯一的问题是“通过聚合或其他集合操作消除空值”。但我认为在这种情况下这不应该是一个问题,只是一个警告。