组合两个SQL Server表结果以提取存在的最新数据
我有两个表一个主表和一个正在进行的工作表。任何插入/更新都会在操作记录时插入WIP表,这允许进行验证检查等。我想创建一个视图,将两个表合并在一起,在WIP表存在时显示WIP表数据,在没有WIP数据时显示主表数据 我已经想出了一个方法来做到这一点,但它似乎不是最优雅的解决方案。我想知道是否有其他想法或更好的解决方案 举例说明情况:组合两个SQL Server表结果以提取存在的最新数据,sql,sql-server,tsql,join,isnull,Sql,Sql Server,Tsql,Join,Isnull,我有两个表一个主表和一个正在进行的工作表。任何插入/更新都会在操作记录时插入WIP表,这允许进行验证检查等。我想创建一个视图,将两个表合并在一起,在WIP表存在时显示WIP表数据,在没有WIP数据时显示主表数据 我已经想出了一个方法来做到这一点,但它似乎不是最优雅的解决方案。我想知道是否有其他想法或更好的解决方案 举例说明情况: select mt.id, wt.id wip_id, isnull(wt.name,mt.name) name, isnull(wt.address,
select mt.id, wt.id wip_id, isnull(wt.name,mt.name) name,
isnull(wt.address, mt.address) address
from main_table mt full outer join
wip_table wt on mt.id = wt.orig_id;
因此,当结果存在时,它将从WIP表中提取结果,如果它们不存在,它将从主表中提取结果。这是一个简单的示例,但这些表可能有许多行。如果您想要从一个表或另一个表中获取数据:
select top 1 *
from
(
select 1 as prio, wt.name, wt.address, .... from wip_table wt where ...
union
select 2 as prio, mt.name, mt.address, .... from main_table mt where ...
order by prio
) x
否则,就像您所做的(检查单个列),但可能使用左外部联接而不是完整联接:
select
mt.id
, wt.id wip_id
, isnull(wt.name,mt.name) name
, isnull(wt.address, mt.address) address
from main_table mt left outer join wip_table wt
on mt.id = wt.orig_id;
如果可以包含模式,则更好:)是的,我需要完整的外部,因为在新插入的情况下,WIP表中的“orig_id”字段为空,直到从WIP表中删除记录时,它实际插入到主表中。在更新的记录上,原始id由主表中的id(PK)填充,因此,如果项目正在更新,我希望看到即将应用的WIP值。您应该使用“union all”而不是“union”,除非您明确希望删除重复项。@Gordon:由于prio列的原因,我不会有重复项。但不管怎么说,联合会更好,因为它节省了一种资源。