【问题标题】:SQL Server : insert record when values or record do not existSQL Server:当值或记录不存在时插入记录
【发布时间】:2021-09-03 09:41:19
【问题描述】:

为了简单起见,假设我有两张表:一张称为People,另一张称为Contacting

People表:

ID primary key
NAME
WEBSITE
EMAIL

Contacting表:

ID (foreign key to People ID)
WAY_OF_CONTACTING
REFERENCE

逻辑如下:对于People 表中的每个人,Contacting 表中可能有几条记录。显然PeopleContacting之间的关系是一对多的。

WAY_OF_CONTACTING 只能有 2 个值:“电子邮件”和“网站”,REFERENCE 列包含电子邮件或网站名称。

Contacting 表的主键是由IDWay_Of_Contacting 组成的复合主键(这意味着,对于每个 ID,它们最多只能有 一个电子邮件和一个网站)

人们表上的记录每晚都会被删除,并且全天都会被填充。

People 表中可能会发生 4 件事:

  1. 网站和电子邮件为空
  2. 网站为空,但没有电子邮件
  3. 电子邮件为空,但不是网站
  4. 网站和电子邮件都不是空的

我的问题如下:

对于People 表中的每条记录

  • insert into ContactingID 存在Contacting 有一个recordWay_of_Contacting='Website' 或当ID 不存在于Contacting

  • insert into ContactingID 存在Contacting 有一个recordWay_of_Contacting='Website' 或当ID 不存在在Contacting

换句话说:

  • 如果People ID 存在Contacting 表中,请检查记录是否在字段Way_of_Contacting 上具有值“Email”
  • 如果该记录不存在,且People table中的Email字段不为空,则insert a record
  • 如果 ID 不存在 并且 People 中的 Email 字段不为空,则 insert a record

Website 也是如此

如何做到这一点?

我尝试过使用mergeif not exists,但似乎找不到正确答案

【问题讨论】:

  • “我尝试过使用合并,如果不存在,但我似乎找不到正确的答案” 这些尝试是什么?为什么他们不工作?
  • 我认为你需要清理这个问题,因为它看起来相当复杂,不清楚为什么或你想要什么,我开始想要帮助但不清楚目标是什么。首先,当这是联系表使用的外键时,为什么要删除 People 行。
  • 在联系表中为什么不将 ID 重命名为 people_Id 并添加一个唯一的主键。以后会省痛的,

标签: sql-server merge sql-server-2012 exists not-exists


【解决方案1】:

您可以尝试使用视图而不是下面的表格吗?优点是视图始终根据人员表进行更新。

CREATE VIEW dbo.Contacting
   AS  
Select
     ID
    ,'Website' as Way_of_Contacting
    ,WEBSITE as Reference   

From People

Where WEBSITE is not null

Union all

Select
     ID
    ,'Email' as Way_of_Contacting
    ,Email as Reference 

From People

Where Email is not null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-07
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2020-11-21
    • 2015-12-17
    • 2011-07-01
    • 2018-04-02
    相关资源
    最近更新 更多