【问题标题】:TSQL Merge Insert With DuplicateTSQL合并插入重复
【发布时间】:2012-06-30 09:11:11
【问题描述】:

我有一个包含重复电子邮件地址的表,我只需要将其中一个与其他两个字段一起插入到临时表中。这里有很多例子,但我可以让其中任何一个工作,

我最终调查了 MERGE,我得到了相同的结果。所有的记录都被插入我迷路了。我尝试了许多不同的样本,但它总是插入所有记录。我回去确保电子邮件地址真的是骗子,他们是......下面是我现在的......

MERGE #EmailTable2 AS Target
USING (SELECT EMAIL, NAME, JOB_TITLE FROM b2b_cmas_list$ WHERE EMAIL IS NOT NULL) AS Source
ON (Target.EMAIL = Source.EMAIL)
 WHEN NOT MATCHED BY TARGET THEN
    INSERT (EMAIL, NAME, JOB_TITLE)
    VALUES (Source.EMAIL, Source.NAME, Source.JOB_TITLE)

OUTPUT $action, inserted.*, deleted.*;

因此,任何有助于纠正此问题的帮助都会有所帮助。

【问题讨论】:

    标签: tsql insert merge duplicates


    【解决方案1】:

    这不起作用,因为 SQL 不知道您要选择包含相同电子邮件的两行中的哪一行。我的意思是:如果 EMAIL 相同,那么(NAME 和 JOB_TITLE)对中的哪一个是重要的,哪些可以被丢弃?

    一些提示:

    1. 如果选择哪个项目无关紧要,只需通过 EMAIL 选择 MAX(NAME) 和 MAX(JOB_TITLE) 进行分组,即

      按 EMAIL 从 b2b_cmas_list$ 组中选择 EMAIL、max(NAME)、max(JOB_TITLE)

      但请注意,这可能会破坏 NAME-JOB_TITLE 对(因为选择了 max)。

    2. 尝试使用 ROW_NUMBER() OVER() 在每组中任意选择第一行。

    3. 使用 CURSOR 遍历行并跳过重复项。

    4. 使用 .NET CLR 聚合来连接同一电子邮件的名称和职位。

    还有一点注意您的 MERGE 语句。这没有按预期工作,因为 SQL 一次检查所有行,而不是逐行检查。因此,如果一封电子邮件不是这样。 IE。 "a@a.com" 被插入,然后另一个不会。仅当“a@a.com”位于语句开头的表中时才重要。

    【讨论】:

    • 但是如果我删除其他两个字段并且只有 EMAIL 字段,我仍然会得到欺骗吗?。
    • 是的,SQL 将 ROW 视为 ROW,无论 EMAIL 是否相同。例如:创建一个表并在该表中插入两个相同的行。现在尝试创建一个语句,该语句将删除一行,而另一行保持不变。看?没有办法这样做。
    • 好的,我明白你现在在说什么了。我打算对这个项目使用 CURSOR 方法,每天只有大约 500 条记录,所以循环遍历对我来说没什么大不了的。
    • 还有一点注意您的 MERGE 声明。这没有按预期工作,因为 SQL 一次检查所有行,而不是逐行检查。因此,如果一封电子邮件不是这样。 IE。 "a@a.com" 被插入,然后另一个不会。仅当“a@a.com”位于语句开头的表格中时才重要。
    猜你喜欢
    • 2012-01-18
    • 2011-11-21
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 2011-04-07
    • 2019-07-07
    • 1970-01-01
    相关资源
    最近更新 更多