【发布时间】:2017-01-13 19:44:28
【问题描述】:
这是我所拥有的非常简化的版本。
我有 2 个数据库表 People 和 Contacts。 People是原始表,但是contacts是一个新表,用于覆盖People表中的数据(这些是实际场景中的不同数据库)
在初始加载时,所有人员记录都被复制到联系人表中,但在初始加载后,可以将新人员添加到人员或联系人表以及设置为已删除的联系人。
我希望所有人都返回,但我希望联系人表是最重要的,例如
例子。
人员表
PersonGuid | PersonId | FirstName | LastName
-----------|----------|-------------|-----
1 xxxx1 | 1 | John | Smith
2 xxxx2 | 2 | Jane | Doe
3 xxxx3 | 3 | John | Doe
4 xxxx4 | 4 | Alice | James
5 xxxx5 | 5 | Claire | Wheeler
联系人表 (Jane Doe 设置为已删除,John Doe 不存在,因为在初始导入后添加,并且已添加 Emma Green。Deleted 为 NULL 对于尚未触及的那些)
ID | LinkedId | FirstName | LastName | Deleted
-----------|----------|-------------|----------|----------
1 xxxx1 | 1 | John | Smith | NULL
2 xxxx2 | 2 | Jane | Doe | 1
3 xxxx3 | NULL | Emma | Green | 0
4 xxxx4 | 4 | Alice | James | 0
5 xxxx5 | 5 | Claire | Wheeler | NULL
我要返回的内容是:(所有记录,但 Jane Doe 在联系人表中设置为已删除)
ID | LinkedId | FirstName | LastName | Deleted
-----------|----------|-------------|----------|----------
1 xxxx1 | 1 | John | Smith | NULL
2 xxxx2 | 2 | Jane | Doe | 1
3 xxxx3 | 3 | John | Doe | 0
4 xxxx4 | NULL | Emma | Green | 0
5 xxxx5 | 4 | Alice | James | 0
6 xxxx6 | 5 | Claire | Wheeler | NULL
但我得到的是: (简·多伊两次)
ID | LinkedId | FirstName | LastName | Deleted
-----------|----------|-------------|----------|----------
1 xxxx1 | 1 | John | Smith | NULL
2 xxxx2 | 2 | Jane | Doe | 1
3 xxxx2 | 2 | Jane | Doe | 0
4 xxxx3 | 3 | John | Doe | 0
5 xxxx4 | NULL | Emma | Green | 0
6 xxxx5 | 4 | Alice | James | 0
7 xxxx6 | 5 | Claire | Wheeler | NULL
我正在尝试合并这两个表,但我不知道如何过滤它以使联系人数据覆盖人员数据但同时从两个表中获取所有数据?
Select PersonGuid as Id,
Personid,
Firstname,
LastName,
cast(0 as bit) as deleted
From DB1.People
Union
Select
Id,
LinkedId as PersonId,
FirstName,
LastName,
Deleted
from DB2.Contacts
我尝试过搜索,但不确定要搜索什么,所以我的术语可能有误。
编辑 - 真正的查询远没有我的示例那么简单,并且 from 是每个查询上大约 6 个表的连接。我试图做一个简单的例子来说明清楚,但不确定这是否使解决方案有所不同?
【问题讨论】:
-
Jane Doe 和 John Doe 是打算拥有相同的 ID 还是拼写错误? Emma Green 和 John Doe 也有同样的问题?
-
刚刚注意到这一点。不,它们不应该具有相同的 ID。我现在要编辑
标签: sql sql-server join union