更新表中值的2列

时间:2016-01-16 11:22:29

标签: sql-server tsql

我有这两个表

Table P

A     | B    | C     | D       
-----------------------------
'abc' | NULL | 'kkk' | NULL
'xyz' | NULL | 'www' | NULL
'pqr' | NULL | 'ccc' | NULL


Table Q

X     | Y
-----------------------------
'abc' | 123
'xyz' | 12
'pqr' | 34

我需要用表Q中的Y值更新表P列B和D,只要表P中的列A和C与表Q中列X的值匹配。

我的更新现在:

UPDATE TableP 
SET B = Q.Y
FROM TableQ Q (NOLOCK)
WHERE Q.X = A

UPDATE TableP 
SET D = Q.Y
FROM TableQ Q (NOLOCK)
WHERE Q.X = C

我只知道如何在2个UPDATE语句中执行此操作,如何在单个UPDATE语句中执行此操作?

3 个答案:

答案 0 :(得分:2)

您可以使用UPDATE FROM JOIN

UPDATE p
SET B = q1.Y,        --COALESCE(q1.Y, p.B) if needed
    D = q2.Y         --COALESCE(q2.Y, p.D)
FROM TableP p
LEFT JOIN TableQ q1
  ON p.A = q1.X
LEFT JOIN TableQ q2
  ON p.C = q2.X;

LiveDemo

输出:

╔═════╦═════╦═════╦═══╗
║  A  ║  B  ║  C  ║ D ║
╠═════╬═════╬═════╬═══╣
║ abc ║ 123 ║ kkk ║   ║
║ xyz ║  12 ║ www ║   ║
║ pqr ║  34 ║ ccc ║   ║
╚═════╩═════╩═════╩═══╝

答案 1 :(得分:2)

使用UPDATE语法

中的Join
UPDATE p
SET B = case when Q.X = p.a then Q.Y else B end,
    D = case when Q.X = p.c then Q.Y else D end
FROM TableP p
INNER JOIN TableQ Q
  ON Q.X  in (p.A,p.C) 

答案 2 :(得分:1)

试试这个

   UPDATE TableP 
   SET B = CASE WHEN Q.X = A THEN Q.Y ELSE B END,
       D = CASE WHEN Q.X = C THEN Q.Y ELSE D END
   FROM TableQ Q (NOLOCK)

但是,我错过了加入。所以这是我更新的解决方案

   UPDATE TableP 
   SET B = CASE WHEN Q.X = A THEN Q.Y ELSE B END,
       D = CASE WHEN Q.X = C THEN Q.Y ELSE D END
   FROM TableQ Q (NOLOCK)
   INNER JOIN TableP P
   ON P.A = Q.X