使用join从另一个表更新表中的列

时间:2018-05-24 09:30:00

标签: sql sql-server sql-update

我需要将两个表从表2复制到表1。 我希望在表2中的匹配上更新表1.列离开

条件 表2具有表1的多个项目(表1与表2有许多关系)。所以在这种情况下,我需要按RotationOrder排序并占据第一行。

表1

Id  Code    Departure
479 JJ1256  NULL
480 SR1255  NULL
481 PFOBLEM NULL
482 SO1301  NULL
483 TS1302  NULL
484 YB1305  NULL
485 CU1303  NULL

表2

Id  Departure   RotationOrder    CanLoad
479 NULL    1       1
480 NULL    1       2                 1
481 NULL    1       3                 1
482 NULL    1       4
482 NULL    3
482 NULL    2
482 NULL    4
483 2013-01-21  1                     1
483 NULL    3
483 NULL    4
483 NULL    6

我尝试了什么

UPDATE table1 set Departure = (select top 1 table2.Departure from table2 
INNER JOIN table1 on table1.Id = table2.Id  where CanLoad =1 order by 
RotationOrder )
FROM TABLE1  INNER JOIN TABLE2 
ON TABLE1.Id = TABLE2.Id

问题 此查询从table2复制第一个null值并将其粘贴到table1上。这是不正确的。

3 个答案:

答案 0 :(得分:2)

交叉应用前1名,心爱的经典:

UPDATE t1 set Departure = q.Departure
FROM table1  t1
cross apply 
(
    SELECT TOP 1 Departure
    FROM table2
    WHERE t1.Id=table2.Id
    ORDER BY RotationOrder asc
)q  

答案 1 :(得分:2)

这是你想要的方式:

UPDATE T1
SET Departure = T2.Departure
FROM Table1 T1
     CROSS APPLY (SELECT ca.*
                  FROM Table2 ca
                  WHERE T1.Id = ca.Id
                  ORDER BY ca.RotationOrder) T2;

请注意在UPDATE子句中使用表的别名。如果您使用表格的实际名称(不是它的别名),您在技术上声明了第二个Table1,它可以/确实产生奇怪的行为,因为它在技术上创建了笛卡尔积。因此,在UPDATE [Table Alias]语句中使用FROM子句时,使用语法UPDATE非常重要。

答案 2 :(得分:1)

忽略空值行。假设每个Id有一个非空行

UPDATE Table1 set Departure = Table2.departure
FROM TABLE1  INNER JOIN TABLE2 
ON TABLE1.Id = TABLE2.Id where Table2.canload =1 and Table2.deprture is not null