带有内部选择的SQL更新语句与Case

3
我希望运行一条批量更新语句,该语句选择列的最小值和最大值。问题在于有多个列具有空值。如果为NULL,则我希望将MinValue设置为0
我有以下语句,但是SELECTELSE出现错误:
UPDATE Table1 SET MaxValue = (
        SELECT MAX(column1) FROM Table2), 
        MinValue = (CASE 
            WHEN SELECT MIN(column1) FROM Table2 <> NULL 
            THEN SELECT MIN(column1) FROM Table2 
            ELSE '0' 
        END) 

我错过了什么?


3
以我所知,您不能以那种方式与NULL进行比较,而且我相当确定MIN函数会忽略NULL值,除非没有其他选项……这不是您出错的原因,但您可能会遇到问题。CASE语句要求使用相同的数据类型,因此将0转换为字符串可能会造成不便。 - Ben
Table1和Table2之间有关系吗? - Mike
1
你是否尝试在子查询周围加上括号,像这样:WHEN (SELECT MIN(column1) FROM Table2) <> NULL - John Gibb
请不要嘲笑我们说你遇到了错误,但是又不肯分享。你真的想要更新所有行,也就是没有WHERE子句,并且使用相同的MinValue和MaxValue,也就是子查询没有相关性吗? - HABO
4个回答

6

这个怎么样?

UPDATE a
SET    a.MaxValue = b.max_val,
       a.MinValue = COALESCE(b.min_val, 0)
FROM   Table1 a
       CROSS JOIN 
       (
          SELECT MAX(column1) max_val, 
                 MIN(column1) min_val 
          FROM   Table2
       ) b

3
以下是您需要立即进行的一些明显调整:
UPDATE Table1 SET MaxValue = (
       SELECT MAX(column1) FROM Table2),
       MinValue = (CASE
           WHEN (SELECT MIN(column1) FROM Table2) IS NOT NULL -- subquery in parentheses per John Gibb's comment and IS NOT NULL rather than <> NULL
           THEN (SELECT MIN(column1) FROM Table2) -- subquery in parentheses per John Gibb's comment
           ELSE 0 -- 0 rather than '0'
       END)

否则,您实际上正在与CASE合并:我会使用COALESCE代替。

1
我仍然认为没有括号不会起作用。 - John Gibb
谢谢,@JohnGibb。发现得好。我更新了答案以反映这个额外的调整。 - J0e3gan

1
为什么不呢?
UPDATE Table1 SET MaxValue = (SELECT MAX(column1) FROM Table2), 
                 MinValue = COALESCE( SELECT MIN(column1) FROM Table2, '0' )
;

0

table1只有一行吗?为什么需要一个表呢?你考虑过使用视图吗?

SELECT COALESCE(MAX(column1),0) AS MaxValue,
  COALESCE(MIN(column1),0) AS MinValue
FROM dbo.Table2

另外,为什么不把最大值也合并起来呢...以防万一。

如果你必须使用表格...

UPDATE dbo.Table1
SET MinValue = t.[min],
  MaxValue = t.[max]
FROM (SELECT MIN(column1) [min], MAX(column1) [max] FROM dbo.Table2) t

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接