gpt4 book ai didi

sql - SQL中两个表之间调整 View 的正确方法是什么

转载 作者:行者123 更新时间:2023-12-05 00:28:34 25 4
gpt4 key购买 nike

我正在寻找一种非破坏性更改数据的方法。我有一张表,其中包含不应编辑的数据 - 它是主数据。我希望用户对这些数据进行编辑,但为了保持主数据的完整性,我创建了第二个表,它是主表结构的镜像。

我的想法是,我基本上会创建一个 View (vAdjustedData),以便将这些数据联合在一起,从而为我提供一个最新版本的数据源。 (这样做的目的是允许用户撤消调整后的表中的数据并将主表数据恢复为当前数据)。

表中的列可以为空。这个想法是,当用户希望进行编辑时,主记录将被复制,应用更改,然后保存到调整表中。我对 UNION 的想法是用调整后的记录掩盖原始主记录,这样当放置在 View 中时,我将获得“当前”数据。删除此调整后, View 将“自动”回滚。

所以我有 Table_Master 和 Table_Adjusted。 Table_Master 有一个主键。 Table_Adjusted 也有主键,但它是 Table_Master 主键的外键。如果两个表都有一个 varchar 列,我希望编写一个类似于以下内容的 View :

(SELECT ID, Value
FROM Table_Adjusted)
UNION
(SELECT ID, Value
FROM Table_Master
WHERE ID NOT IN (SELECT ID FROM Table_Adjusted))

上面的 UNION 应该带来所有调整后的值,然后是所有没有调整记录的主值。

这是正确的方法吗?对我来说,这似乎效率低下。我认为 EXCEPT 会起作用(使用 SQL2K8),但它似乎不合适。

最佳答案

我假设您希望调整后的表格仅调整值而不是添加或删除值。您的查询有一个缺点,即理论上可以添加甚至不存在于原始表中的新值。此版本可防止这种可能的风险:

SELECT Table_Master.ID,
CASE WHEN Table_Adjusted.ID IS NULL THEN Table_Master.Value
ELSE Table_Adjusted.Value
END AS Value
FROM Table_Master
LEFT JOIN Table_Adjusted
ON Table_Master.ID = Table_Adjusted.ID

此外,您的查询使用 UNION DISTINCT 但实际上您只需要一个 UNION ALL。这个稍微修改过的查询版本应该运行得稍微快一点:
SELECT ID, Value
FROM Table_Adjusted
UNION ALL
SELECT ID, Value
FROM Table_Master
WHERE ID NOT IN (SELECT ID FROM Table_Adjusted)

关于sql - SQL中两个表之间调整 View 的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2225628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com