从具有复合主键的另一个表插入或更新表

2023-12-22

我正在寻找正确的语法和方法来直接从 SQL 执行以下操作:插入或更新(如果数据已存在)TableMain从包含的数据TableA两者具有相同的复合主键。

两个表都定义为:

CREATE TABLE TableA (
[TID0] [int] NOT NULL,
[TID1] [int] NOT NULL,
[language] [nvarchar](2) NOT NULL,
[TID2] [nvarchar](200) NOT NULL,
[text] [nvarchar](max) NULL,
[updatedOn] [datetime] NOT NULL  DEFAULT (getdate())
PRIMARY KEY (
    [TID0],
    [TID1],
    [language],
    [TID2],
)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

TableA将定期删除和填充。

TableMain与相同的定义相同,但将包含更多行数据,我需要的是插入从未见过的值TableA into TableMain,并更新已经存在的行。

我曾经做过这种插入,但我不知道如何处理更新和复合主键:

INSERT INTO TableMain 
    SELECT * FROM TableA

编辑:我正在使用SQL Server 9.00.5000

编辑:受 MERGE 启发的另一种方式和模仿它 http://sqlserver-tips.blogspot.fr/2006/09/mimicking-merge-statement-in-sql.html

DECLARE @updatedIDs TABLE(
    [TID0] [int],
    [TID1] [int],
    [language] [nvarchar](2),
    [TID2] [nvarchar](200),
                PRIMARY KEY ([TID0], [TID1], [language], [TID2])  -- as stated by Nikola Markovinović above, thanks
);

-- First update records 
update TableMain 
   set [text]      = source.[text], 
       [updatedOn] = source.[updatedOn] 
       OUTPUT
         inserted.[TID0]
         inserted.[TID1]
         inserted.[language]
         inserted.[TID2]
       INTO @updatedIDs
  from 
       TableMain AS main
       , TableA AS source 
  WHERE    
   TableMain.[TID0]         = source.[TID0] 
   and TableMain.[TID1]     = source.[TID1] 
   and TableMain.[language] = source.[language] 
   and TableMain.[TID2]     = source.[TID2] 

-- And then insert 

insert into TableMain
select *
  from TableA AS source 
 where not exists 
       ( 
      select 1
        from @updatedIDs AS i
       where i.[TID0]     = source.[TID0] 
         and i.[TID1]     = source.[TID1] 
         and i.[language] = source.[language] 
         and i.[TID2]     = source.[TID2] 
       )

你应该使用merge http://technet.microsoft.com/pt-br/library/bb510625.aspx声明

像这样的东西:

merge TableMain  AS target
using TableA as source 
ON <join tables here>
WHEN MATCHED THEN <update>
WHEN NOT MATCHED BY TARGET <Insert>
WHEN NOT MATCHED BY SOURCE <delete>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从具有复合主键的另一个表插入或更新表 的相关文章

随机推荐

  • Ionic 2 存储在卸载时不会清理 - 仅适用于已签名的 APK

    我正在使用 Ionic 2 存储来存储用户凭据 卸载应用程序时 存储不会清除 因此重新安装后 应用程序将获取先前用户的用户凭据 此问题仅发生在签名的 APK 中 在 Samsung on7 和 lenovo vivi 型号上进行了测试 卸载
  • iOS如何根据其中的UILabel制作UIView的动态宽度/自动布局

    我可能正在努力解决一些菜鸟问题 我有一个UIView其中我显示一些价格 我想要UIView根据价格具有动态宽度 如果是 1 欧元 那么它将是例如20pt 如果是 2300 欧元 那么就会像50pt宽度 我试图利用故事板的限制 但没有成功 是
  • Spring 和 /* url 模式

    我们有一个 的 url 模式并且请求到达我们的控制器 但我们总是得到 404 这是我们的 web xml
  • 谷歌面积图线下可变不透明度?

    我正在使用谷歌图表中的面积图 我想知道是否有办法设置每条线的不透明度 看这个例子 https developers google com chart interactive docs gallery areachart hl nl Simp
  • 如果参数为 NULL,如何从 WHERE 子句中删除条件

    我将 2 个参数传递给 PL pgSQL 函数 这是查询 SELECT FROM table WHERE col1 param1 AND col2 param2 两个参数都可以为 NULL 在这种情况下 应从WHERE clause 我怎样
  • 带 2 个按钮的警报

    我将在我的应用程序中添加一个指向网站的链接 用户将单击一个显示 网站 的按钮 然后将出现一个带有 2 个按钮的警报 其中一个按钮只是取消按钮 另一个按钮将打开网站 你能帮我解决这个问题吗 Thanks 将其放入您的头文件中 interfac
  • 使用互斥锁时尝试引用已删除的函数

    我在处理项目时遇到奇怪的错误 我创建了一个超级简单的示例来重现错误 我创建了一个类 我想在这个类中做的是为我的类提供一种 getter 函数来填充 a 的值struct 在主应用程序中 用户将实例化这个struct 将其传递给成员函数 并能
  • Z3 Solver Java API:意外行为

    通过向求解器添加条件 我想使用 solver check 检查是否存在解 因此 我创建了一个简单的示例来寻找 t1 的解决方案 我知道 t1 有一个解 即 t1 0 然而 求解器的状态不是 SATISFIABLE public static
  • 将 base64 字符串转换为与 OpenCV 兼容的图像

    我正在尝试将 JPEG 的 Base64 表示形式转换为可与 OpenCV 一起使用的图像 问题是我希望能够做到这一点而不必物理保存照片 我希望它保留在内存中 有更新的方法来实现这一点吗 我正在使用 python 3 6 2 和 OpenC
  • ZMQ套接字连接超时

    我正在使用 ZMQ cppzmq 的 C 绑定 并且尝试使用以下命令设置 TCP 套接字的连接超时 setsockopt 这样的方法 int connectTimeout 1000 socket setsockopt ZMQ CONNECT
  • 替换对shared_ptr中对象的所有引用

    是否可以替换shared ptr的多个实例引用的对象 可能我不太清楚 我举个例子 shared ptr a new Derived1 auto b a auto c b This function replaces the object w
  • TypeError 对象不可迭代

    当尝试循环 Django 模板中的变量时 出现以下错误 有问题的变量是我的 DetailView 子类中指定的模型的相关对象 类型错误位于 en applicants 50771459778 Householdmember 对象不可迭代 这
  • 如何在 PHP 中通过 cURL 发送 XML 和其他 post 参数

    我使用下面的代码将 XML 发送到我的 REST API xml string data 包含正确的 XML 并且它很好地传递到 mypi php set POST variables url http www server cu mypi
  • 解释器关闭时线程化导入

    蟒蛇的threading文档 http docs python org dev library threading html importing in threaded code states 所有导入尝试必须在解释器启动之前完成 自行关闭
  • 线程最佳实践

    我从事的许多项目的线程实现都很差 而我就是必须追踪这些问题的傻瓜 是否有公认的最佳方法来处理线程 我的代码总是等待一个永远不会触发的事件 我有点像设计模式之类的想法 假设 NET 类似的事情也适用于其他平台 嗯 有lots需要考虑的事情 我
  • 如何检测脚本中的Python版本2或3?

    我编写了一些脚本 它们要么仅在 Python 2 x 版本上运行 要么仅在 Python 3 x 版本上运行 如果脚本是从合适的 Python 版本开始的 我如何检测脚本内部 有没有类似这样的命令 major minor getPython
  • 为什么 MPI_Barrier 会导致 C++ 中的分段错误

    我已将程序简化为以下示例 include
  • 在 Drupal 8 中的特定节点类型上使用预处理钩子

    我已经成功使用预处理页面挂钩 例如 function mytheme preprocess page node front variables and function mytheme preprocess page node 12 var
  • 如何在 foreachBatch 中使用临时表?

    我们正在构建一个流平台 其中批量使用 SQL 至关重要 val query streamingDataSet writeStream option checkpointLocation checkPointLocation foreachB
  • 从具有复合主键的另一个表插入或更新表

    我正在寻找正确的语法和方法来直接从 SQL 执行以下操作 插入或更新 如果数据已存在 TableMain从包含的数据TableA两者具有相同的复合主键 两个表都定义为 CREATE TABLE TableA TID0 int NOT NUL