我有两个 SQL Server 数据库,我需要使用表 B 上的查询结果来更新表 A。我只熟悉编写简单的 SQL 查询,并且正在努力将其拼凑在一起。
选择查询按预期工作,返回与表 A 中为
serial_number
提供的两个数字字符串匹配的所有记录。然后返回 serial_number
、registration_number
和 registered_date
,返回最低日期为可以有多条记录。
然后我想使用查询表 A 的结果更新表 B。对于表 B 中与
serial_number
和 registration_number
匹配并且状态为“UNREGISTERED
”的任何记录,然后更新该记录以设置状态作为“REGISTERED
”,并使用表 A 的选择查询中的 registered_date
填充表 B 中的 registered_date
列。
我阅读了一些指南和文档,以使用另一个表中的选择查询的结果来更新表,但我在编写的查询中收到语法错误。
我的 IDE 在 UPDATE 行上显示
SET or WITH expected, got 'car'
,并且在 SET 后的第一行上显示 Unable to resolve symbol 'car'
。
下面是我写的查询,不幸的是它不起作用:
UPDATE Car.dbo.car_details car
(
SELECT serial_number, registration_number, min(registered) as registered_date
FROM Owner.dbo.owner
WHERE serial_number = '123456' OR serial_number = '654321'
GROUP BY serial_number, registration_number
) AS src
SET
car.registered = 'REGISTERED',
car.registered_date = src.registered_date
WHERE
car.status = 'UNREGISTERED'
AND
car.serial_number = src.serial_number
AND
car.registration_number = src.registration_number
通常(如其他一些回复链接的文章中所述),您只需在
FROM
语句的 UPDATE
子句中加入源表和目标表,然后在 UPDATE
中引用目标表的别名
声明本身。
类似:
UPDATE car
SET
car.registered = 'REGISTERED',
car.registered_date = own.registered
FROM Car.dbo.car_details car
JOIN Owner.dbo.owner own
ON own.serial_number = car.serial_number
AND own.registration_number = car.registration_number
WHERE car.status = 'UNREGISTERED'
AND car.serial_number IN ('123456', '654321')
但是,在您的情况下,似乎可能有多个匹配的所有者行,您需要选择最早的日期。在这种情况下,您可以使用 OUTER APPLY(SELECT TOP 1 ... ORDER BY ...) 模式直接为每个要更新的
owner
选择最佳匹配的 car
行。
类似:
UPDATE car
SET
car.registered = 'REGISTERED',
car.registered_date = src.registered_date
FROM Car.dbo.car_details car
CROSS APPLY (
SELECT TOP 1 own.registered as registered_date
FROM Owner.dbo.owner own
WHERE own.serial_number = car.serial_number
AND own.registration_number = car.registration_number
ORDER BY own.registered -- Choose earliest first
) AS src
WHERE car.status = 'UNREGISTERED'
AND car.serial_number IN ('123456', '654321')
为了提高效率,您应该确保
Hour_Cost
表有适当的索引,例如owner (serial_number, registration_number, registered)
可用于快速查找匹配的所有者行并选择第一个/最早的注册日期。
您也可以从原始帖子加入子查询,但这可能会导致 SQL Server 在仅对少数需要它的汽车应用更新之前计算所有汽车的最早注册日期。