当前位置: 首页 > 面试题库 >

将数据合并到两个目标表中

洪星文
2023-03-14
问题内容

我需要将供体表中的数据合并到两个目标表中。结构如下。如果在跟踪表中找不到projid,则需要在组件表中创建新组件,并使用新的ID插入到跟踪表中。此外,对于供体表中不再存在的那些项目,跟踪表的“活动”列应标记为0。我可以在单个merge语句中实现此功能吗?

供体表

projid      | datestamp    | Ownerid
-------------------------------------------------
c_abc        1-jan-2013      name1
c_def        2-jan-2013      name3
c_ghi        3-jan-2013      name4

跟踪表

compid      |projid     |active | ... 
-----------------------------------------------
123           c_abc      1
124           c_xyz      1
125           c_def      1

成分表

compid      |ownerid
-------------------------
123      name1
124      name2
125      name3

合并后的输出表:

成分表

compid      |ownerid
-------------------------
123      name1
124      name2
125      name3
126      name4

跟踪表

compid      |projid     |active | ... 
-----------------------------------------------
123          c_abc       1
124          c_xyz       0
125          c_def       1
126          c_ghi       1

问题答案:

从理论上讲,应该有一个解决方案可以在单个语句中执行此操作,但是到目前为止,我还没有找到它。*

这是使用两个MERGE语句可以完成的方法:

WITH CTE_trgt AS 
(
    SELECT c.compid, c.ownerid, t.projid, t.active 
    FROM component c
    INNER JOIN trace t ON c.compid = t.compid
)
MERGE CTE_trgt t
USING Donor s
ON t.projid = s.projid
WHEN NOT MATCHED BY TARGET
    THEN INSERT (ownerid)
    VALUES (s.ownerid)
OUTPUT
    INSERTED.compid, s.projid, 1 INTO trace;


MERGE trace t
USING Donor s
ON t.projid = s.projid
WHEN NOT MATCHED BY SOURCE 
    THEN UPDATE SET t.active = 0;

SQLFiddle演示

*具有更新活动列的部分:

WHEN NOT MATCHED BY SOURCE 
    THEN UPDATE SET t.active = 0

应该能够适合上面的查询,为所有操作创建单个merge语句,但是会引发错误:

视图或函数“ t”不可更新,因为修改会影响多个基表

即使它显然是单列,并且定期进行非合并更新也可以。也许有人知道原因和/或解决方法。



 类似资料:
  • 问题内容: 是否可以将两个表(具有相同的字段)中的数据捕获到一个视图中。基本上,因此视图将数据视为一个表。 问题答案: 是的,使用UNION- …要求列数相同,并且每个位置的数据类型都匹配。 ..优选地,使用JOIN: 但是我要警告不要依赖于视图-如果未实现,它们只是准备好的SQL语句。没有性能优势,如果您基于另一个视图构建视图,则会对性能产生负面影响。此外,视图是脆弱的- 它们可以更改,如果有问

  • 问题内容: 我有2个表:product和cart,我希望结合这2个表并根据特定条件以数组形式显示数据,如下所示: 应显示特定类别下的所有产品,如果特定用户购买了给定产品中的任何产品,则其详细信息也应显示在该产品的前面 我到目前为止所做的代码是 它给出了这样的数组 但是我想要代替上面的数组的最后一个数组是 产品表视图(如您所见,产品表中包含一个productid,在每个productid下最多可以有

  • 我有两个代号为“一”的独立项目,它们都运行良好,现在我想将这两个项目合并为一个。我知道如何组合代码和类文件,但我想知道如何组合两个项目的文件,因为在一个文件,很难再次创建所有文件。请建议是否有任何方法我可以结合两个文件,或者我可以使用两个一个项目中的文件。e、 g。 项目1:名称:test1有主题。res文件和12个表格 项目2:名称:test2有主题。res文件和18表格 新项目:名称:Merg

  • 问题内容: 所有,我必须创建一个具有基本架构的数据库。该数据库将很大(超过100GB),并将用作数据仓库。现在,该数据库的创建当前正在通过C#代码“一次命中”执行。从许多不同的来源中提取数据。由于数据量巨大,这种创建引起了一些问题。已经决定,与其一口气创建一个数据库,不如一次创建一个数据库。到 创建几个包含核心数据表的较小数据库。 将较小的数据库合并为一个较大的数据库。 建立架构/添加相关约束。

  • 问题内容: 在将关系数据库建模为库存管理系统时,我遇到了一些麻烦。目前,它只有3个简单的表: 产品 收货 销售量 由于收货和销售是相同的,所以我正在考虑采用另一种方法: 产品 Receivings_Sales(名称无关紧要) 列类型将标识它是收货还是销售。 谁能帮助我选择最佳选择,指出两种方法的优缺点?第一个似乎合理,因为我以ORM方式进行思考。 谢谢! 问题答案: 我个人比较喜欢第一个选择,那就

  • rank ▲ ✰ vote url 65 357 50 683 url 合并两个列表 怎样合并两个列表? 例如: listone = [1,2,3] listtwo = [4,5,6] 我期待: mergedlist == [1, 2, 3, 4, 5, 6] 在Python中非常容易. mergedlist = listone + listtwo