Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
组合两个SQL Server表结果以提取存在的最新数据_Sql_Sql Server_Tsql_Join_Isnull - Fatal编程技术网

组合两个SQL Server表结果以提取存在的最新数据

组合两个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,

我有两个表一个主表和一个正在进行的工作表。任何插入/更新都会在操作记录时插入WIP表,这允许进行验证检查等。我想创建一个视图,将两个表合并在一起,在WIP表存在时显示WIP表数据,在没有WIP数据时显示主表数据

我已经想出了一个方法来做到这一点,但它似乎不是最优雅的解决方案。我想知道是否有其他想法或更好的解决方案

举例说明情况:

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列的原因,我不会有重复项。但不管怎么说,联合会更好,因为它节省了一种资源。