我正在使用我无法更改的数据库架构 - 我需要运行批量更新。我正在使用相同的模式在源数据库和目标数据库之间移动数据。我知道这很糟糕,但这正是我现在正在处理的事情。
架构如下:
Car
CarType1
CarType2
CarType3
CarType4
我要做的是 - 通过更新目标CarTypes从我的源数据库中提取CarTypes。
我的问题是:
如果我的汽车“宝马”的源记录有3个CarTypes指定如下:
Car: BMW
CarType1: Fast
CarType2: Well Made
CarType3: Good Handling
CarType4: NULL
我的目标有:
Car: BMW
CarType1: Fun Car
CarType2: NULL
CarType3: NULL
CarType4: NULL
如何编写更新语句,以使源中的CarType1-2-3填充目标上的可用NULL字段?所以来源:CarType1 - >目标:CarType2。而且 - 如果目标中没有所有源字段的空间(比如我的源中是否有4个CarType值,并且仅有),则会有一种方法可以取消此记录的批量更新并记录消息3个NULL CarType列在相应的目标行中?
谢谢!
答案 0 :(得分:1)
我不知道在一个声明中这样做,但是有四个UPDATE语句可以解决这个问题 最终选择会显示哪些列已溢出。
DECLARE @CarsSource TABLE (Car VARCHAR(32), CarType1 VARCHAR(32), CarType2 VARCHAR(32), CarType3 VARCHAR(32), CarType4 VARCHAR(32))
DECLARE @CarsDestination TABLE (Car VARCHAR(32), CarType1 VARCHAR(32), CarType2 VARCHAR(32), CarType3 VARCHAR(32), CarType4 VARCHAR(32))
INSERT INTO @CarsSource VALUES ('BMW', 'Fast', 'Well Made', 'Good Handling', NULL)
INSERT INTO @CarsSource VALUES ('Overflow', 'Fast', 'Well Made', 'Good Handling', 'Overflow')
INSERT INTO @CarsDestination VALUES ('BMW', 'Fun Car', NULL, NULL, NULL)
INSERT INTO @CarsDestination VALUES ('Overflow', 'Fun Car', NULL, NULL, NULL)
UPDATE @CarsDestination
SET CarType1 = s.CarType1
, CarType2 = s.CarType2
, CarType3 = s.CarType3
, CarType4 = s.CarType4
FROM @CarsDestination d
INNER JOIN @CarsSource s ON s.Car = d.Car
WHERE d.Cartype1 IS NULL
UPDATE @CarsDestination
SET CarType2 = s.CarType1
, CarType3 = s.CarType2
, CarType4 = s.CarType3
FROM @CarsDestination d
INNER JOIN @CarsSource s ON s.Car = d.Car
WHERE d.Cartype2 IS NULL
UPDATE @CarsDestination
SET CarType3 = s.CarType1
, CarType4 = s.CarType2
FROM @CarsDestination d
INNER JOIN @CarsSource s ON s.Car = d.Car
WHERE d.Cartype3 IS NULL
UPDATE @CarsDestination
SET CarType4 = s.CarType1
FROM @CarsDestination d
INNER JOIN @CarsSource s ON s.Car = d.Car
WHERE d.Cartype4 IS NULL
SELECT *
FROM @CarsSource s
LEFT OUTER JOIN @CarsDestination d ON COALESCE(d.Cartype4, d.Cartype3, d.Cartype2, d.Cartype1) = COALESCE(s.Cartype4, s.Cartype3, s.Cartype2, s.Cartype1)
WHERE d.Car IS NULL