sql select update multiple column并在更新前检查not null

时间:2017-07-06 11:09:46

标签: sql sql-server sql-server-2008-r2

我有两张桌子 表1结构NOT NULL。
表2某些值为NULL 我想更新table2到table1,
我想要选择值,如果null不更新,跳过下一列有更新值。

我的表

table1      value(table1)      table2       value(table2)
t1ID        1234               t2ID         1234
t1Name      Bear               t2Name       null
t1Adress    87/25              t2Adress     99/77
t1Tel       01254798535        t2Tel        null

我的代码

UPDATE table1
SET t1Name = (SELECT t2Name
    FROM table2
    WHERE t2Name IS NOT NULL
    ),
    t1Adress = (SELECT t2Adress
    FROM table2
    WHERE t2Adress IS NOT NULL
    ),
    t1Tel = (SELECT t2Tel
    FROM table2
    WHERE t2Tel IS NOT NULL
    )
FROM table1,table2
WHERE t1ID = '1234' AND t2ID ='1234'

当我执行时,我得到错误:

  

SQL错误:消息512,级别16,状态1,行1子查询返回更多   比1值。当子查询跟随=,!=时,不允许这样做,   &lt ;,< =,>,> =或者当子查询用作表达式时。该   声明已被终止。

我该如何解决?

2 个答案:

答案 0 :(得分:2)

我想你打算:

UPDATE t1
    SET t1Name = COALESCE(t2.t2Name, t1.t1Name),
        t1Adress = COALESCE(t2.t2Adress, t1.t1Adress),
        t1Tel = COALESCE(t2.t2Tel, t1.t2Tel)
    FROM table1 t1 JOIN
         table2 t2
         ON t1.t1id = t2.t2id
    WHERE t1.t1ID = 1234;

请注意,我删除了'1234'上的单引号。 Id通常是数字,因此应将它们与数字进行比较。

您的代码失败,因为您使用的是子查询而不是join中的值。你似乎在table2中有多行,所以你得到的子查询返回了多行错误。

答案 1 :(得分:0)

以下查询使用table1值替换空值,并从table2值

更新其余值
UPDATE T1 SET T1.t1Name = IsNull(T2.t2Name,T1.t1Name),
              T1.t1Adress = IsNull(T2.t2Adress,T1.t1Adress),
              T1.t1Tel = IsNull(T2.t2Tel,T1.t1Tel)
        FROM table1 TI
                INNER JOIN table2 T2 ON T1.t1ID = T2.t2ID

尝试以下选择查询以检查结果

SELECT T1.t1Name,IsNull(T2.t2Name,T1.t1Name),T1.t1Adress,IsNull(T2.t2Adress,T1.t1Adress),T1.t1Tel,IsNull(T2.t2Tel,T1.t1Tel)
        FROM table1 TI
                INNER JOIN table2 T2 ON T1.t1ID = T2.t2ID