SQL Server 2008:有条件地更新 table 列
SQL Server 2008: updating table columns conditionally
我对 SQL 还是很陌生,所以请耐心等待。
为了简化我的问题,假设我有 2 个相同的人 tables attributes/fields 例如 ID,last_name,first_name,date_of_birth 、街道、城市、州、邮政编码。
我希望 table 2 根据 table 1 中的内容进行更新,但我希望保留自上次以来添加的 table 2 中的数据我从 table 刷新的时间 1.
它归结为两个我不知道如何转换为 SQL 查询的逻辑轨道:
- 更新 table 2 中为空的列
- (我不知道该怎么做)更新 table 2 中的列,包括覆盖现有数据,除非从 table 1 中的相应列进行覆盖用空值覆盖 table 2 中的数据。
提前致谢
更新
好的,所以 2 table 开始时是相同的:
然后,用户将更新 table 2,而 table 1 也会同时收到更新。
假设 ID 1 的名字和中间名在 table 2 中更新,而 ID 2 的中间名在 table 1 中更新。
Person table changes before update
所以现在,我正在尝试提出一个 SP,它将基于 table 1 并使用我上面描述的逻辑更新 table 2。
table2 中的每一列都应该被table1 中相应列中的数据覆盖,即使它覆盖了现有数据。所以'John'又会变成Rachel。我想为这种覆盖做的例外是 table 2 中的数据将被空值覆盖。
所以当 John 将被覆盖回 Rachel 时,William 作为 middle_name 应该保留在 table 2 中,因为 table 1 的 ID 为空值(编号 1)
我会 post 另一张所需输出的图片,但显然我还没有足够的声誉来 post 超过 2 个链接。所以这是我想要的文本输出
Person_2 更新后
ID|last_name|first_name|middle_name
1|阿迪|雷切尔|威廉
2|阿吉拉尔|理查德|杰弗里
3|...
好吧,我终于明白了。
这是我所做的。
如果有人有更有效的方法来做到这一点,我会洗耳恭听。谢谢
SELECT Person_2.id
,CASE WHEN Person_2.ID=Person_1.id
AND Person_2.last_name IS NULL
THEN Person_1.last_name
WHEN Person_2.ID=Person_1.id
AND Person_2.last_name IS NOT NULL
AND Person_1.last_name IS NULL
THEN Person_2.last_name
WHEN Person_2.ID=Person_1.id
AND Person_2.last_name IS NOT NULL
AND Person_1.last_name IS NOT NULL
THEN Person_1.last_name
END AS last_name
,CASE WHEN Person_2.ID=Person_1.id
AND Person_2.first_name IS NULL
THEN Person_1.first_name
WHEN Person_2.ID=Person_1.id
AND Person_2.first_name IS NOT NULL
AND Person_1.first_name IS NULL
THEN Person_2.first_name
WHEN Person_2.ID=Person_1.id
AND Person_2.first_name IS NOT NULL
AND Person_1.first_name IS NOT NULL
THEN Person_1.first_name
END AS first_name
,CASE WHEN Person_2.ID=Person_1.id
AND Person_2.middle_name IS NULL
THEN Person_1.middle_name
WHEN Person_2.ID=Person_1.id
AND Person_2.middle_name IS NOT NULL
AND Person_1.middle_name IS NULL
THEN Person_2.middle_name
WHEN Person_2.ID=Person_1.id
AND Person_2.middle_name IS NOT NULL
AND Person_1.middle_name IS NOT NULL
THEN Person_1.middle_name
END AS middle_name
FROM Person_2
LEFT JOIN [Person_1] ON Person_2.id=Person_1.id
我对 SQL 还是很陌生,所以请耐心等待。
为了简化我的问题,假设我有 2 个相同的人 tables attributes/fields 例如 ID,last_name,first_name,date_of_birth 、街道、城市、州、邮政编码。
我希望 table 2 根据 table 1 中的内容进行更新,但我希望保留自上次以来添加的 table 2 中的数据我从 table 刷新的时间 1.
它归结为两个我不知道如何转换为 SQL 查询的逻辑轨道:
- 更新 table 2 中为空的列
- (我不知道该怎么做)更新 table 2 中的列,包括覆盖现有数据,除非从 table 1 中的相应列进行覆盖用空值覆盖 table 2 中的数据。
提前致谢
更新
好的,所以 2 table 开始时是相同的:
然后,用户将更新 table 2,而 table 1 也会同时收到更新。
假设 ID 1 的名字和中间名在 table 2 中更新,而 ID 2 的中间名在 table 1 中更新。
Person table changes before update
所以现在,我正在尝试提出一个 SP,它将基于 table 1 并使用我上面描述的逻辑更新 table 2。
table2 中的每一列都应该被table1 中相应列中的数据覆盖,即使它覆盖了现有数据。所以'John'又会变成Rachel。我想为这种覆盖做的例外是 table 2 中的数据将被空值覆盖。
所以当 John 将被覆盖回 Rachel 时,William 作为 middle_name 应该保留在 table 2 中,因为 table 1 的 ID 为空值(编号 1) 我会 post 另一张所需输出的图片,但显然我还没有足够的声誉来 post 超过 2 个链接。所以这是我想要的文本输出
Person_2 更新后
ID|last_name|first_name|middle_name
1|阿迪|雷切尔|威廉
2|阿吉拉尔|理查德|杰弗里
3|...
好吧,我终于明白了。 这是我所做的。
如果有人有更有效的方法来做到这一点,我会洗耳恭听。谢谢
SELECT Person_2.id
,CASE WHEN Person_2.ID=Person_1.id
AND Person_2.last_name IS NULL
THEN Person_1.last_name
WHEN Person_2.ID=Person_1.id
AND Person_2.last_name IS NOT NULL
AND Person_1.last_name IS NULL
THEN Person_2.last_name
WHEN Person_2.ID=Person_1.id
AND Person_2.last_name IS NOT NULL
AND Person_1.last_name IS NOT NULL
THEN Person_1.last_name
END AS last_name
,CASE WHEN Person_2.ID=Person_1.id
AND Person_2.first_name IS NULL
THEN Person_1.first_name
WHEN Person_2.ID=Person_1.id
AND Person_2.first_name IS NOT NULL
AND Person_1.first_name IS NULL
THEN Person_2.first_name
WHEN Person_2.ID=Person_1.id
AND Person_2.first_name IS NOT NULL
AND Person_1.first_name IS NOT NULL
THEN Person_1.first_name
END AS first_name
,CASE WHEN Person_2.ID=Person_1.id
AND Person_2.middle_name IS NULL
THEN Person_1.middle_name
WHEN Person_2.ID=Person_1.id
AND Person_2.middle_name IS NOT NULL
AND Person_1.middle_name IS NULL
THEN Person_2.middle_name
WHEN Person_2.ID=Person_1.id
AND Person_2.middle_name IS NOT NULL
AND Person_1.middle_name IS NOT NULL
THEN Person_1.middle_name
END AS middle_name
FROM Person_2
LEFT JOIN [Person_1] ON Person_2.id=Person_1.id