【发布时间】:2020-01-06 14:12:02
【问题描述】:
我觉得一看到这个我就要打自己,但是这里是:
数据:
CREATE TABLE testdata (
id int,
email varchar(25),
street nvarchar(50),
town nvarchar(15),
zip nvarchar(5)
source nvarchar(15))
INSERT INTO testdata (
id,
email,
street,
town,
zip,
source
)
VALUES
(
1,
'myemail@email.com',
null,
'happy',
null
),
(
1,
'myemail@gmail.com',
null,
'happy',
'19400'
);
这会产生:
-------------------------------------------------------------
|id |email |street |town |zip |
|1 |myemail@email.com |happy place |happy |(null) |
|1 |myemail@gmail.com |(null) |happy |19400 |
我想要达到的是
|id |email |street |town |zip |
|1 |myemail@email.com |happy place |happy |19400 |
基本上,我想折叠所有行并在 ID 相同的情况下抓取任何不为空的内容。如果它们都为空,则获取空值。我尝试通过合并进行自加入,但没有奏效。我觉得好像我已经很接近了,但是有没有我可以使用的功能可以让这更容易?
注意事项:只能有两行具有相同的 ID(不确定这是否更难或更容易)。如果两行都填充了信息,我想要第一行。
【问题讨论】:
-
“第一行”对您意味着什么?考虑一下,对于 SQL Server,表是未排序的行包,除非表中有一些数据定义了顺序对您意味着什么。还有一个名为
id但允许重复值的列似乎是一个严重的设计缺陷。标识符应该是键。 -
如果您将
id设为主键并将email设为唯一约束,则永远不会出现重复项。 -
这有点难以理解,但本质上具有相同 ID 的本质是另一个折叠记录的进程。因此,在上述情况下,有一次是 ID 1 和 ID 2,但系统识别出重复的值,因此删除了一个并保留了另一个。这是 50,000 英尺的景观
-
如果用户输入了两次凭据,您可能应该及时取最后一次。如果他搬到另一个地方,那么从另一个条目中填写缺失的部分可能不是一个好主意,因为这可能会混淆不相关的地址。如果他从没有街道名称的“小村庄”搬到纽约百老汇,结果可能会变成百老汇小村庄。
-
遗憾的是,这是由销售团队推动的。当有人懒得搜索人 X 时,他们只需输入他即可生成一个新的唯一 ID。由于所有其他信息都可以匹配,因此可以通过 CRM 中的流程将其折叠。
标签: sql sql-server tsql