我需要将两个表从表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上。这是不正确的。
答案 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