【问题标题】:Prevent same rows to insert into table防止相同的行插入到表中
【发布时间】:2019-07-29 11:23:08
【问题描述】:

我正在尝试跳过在主键列中包含相同数据的行 并将结果插入到主表中。

我也在使用 distinct 关键字。行是不同的,但主键列包含一些相同的数据。

我已经尝试过IGNORE_DUP_KEY = ON,但是插入了重复的一行。我不希望插入任何包含主键列中重复数据的行

SELECT DISTINCT m.Mainname,ipaddress, domain, firstname, lastname,v.id, 
v.idtype,m.SerialNumber FROM firsttable m  INNER JOIN view_sometable v ON 
   v.SerialNumber = m.Mainname
   WHERE m.Mainname Not IN (
                 SELECT Mainname FROM Mastertable) 
          and v.SerialNumber <>''
                 AND v.Mainname<> m.Mainname
                 and m.Mainname IN (select Hostname from firsttable where
          Mainname like 'som-%' OR Mainname like 'li-%' OR Mainname like 'spl-%') 

从上面的 select 语句中,我能够检索到确切的数据,但有时我会得到两个不同的行,但 mainname 列包含相同的数据,我无法跳过并恢复插入。

【问题讨论】:

  • 首先,选择主键字段中的所有不同值,然后将其作为内部查询或连接输入到查询中。
  • 在上面的查询结果中,我在 Mainname 列中获得了一些多个数据,我想从结果中跳过所有多个列并继续插入。如果可能的话,你能给我查询吗
  • 该行是否仅在主键中具有相同的值?还是所有列?如果重复行在所有列中的值不同,则需要指定条件以指定选择哪一行。
  • 仅对于序列号列,重复主键列的数据不同

标签: sql-server insert


【解决方案1】:

您可以使用cteRownumber 删除重复项。试试这个

;with cte as(
 SELECT 
 m.Mainname,ipaddress, domain, firstname, lastname,v.id, v.idtype,m.SerialNumber,  
 ROW_NUMBER OVER(partition by YOURPRIMARYKEY order by ASYOURREQUIREMENT) as [Row_Num]
 FROM firsttable m  
 INNER JOIN view_sometable v ON v.SerialNumber = m.Mainname
 WHERE m.Mainname Not IN ( SELECT Mainname FROM Mastertable) 
 and        v.SerialNumber <>''
 AND v.Mainname<> m.Mainname
 and m.Mainname IN (select Hostname from firsttable where Mainname like 'som-%' OR 
     Mainname like 'li-%' OR Mainname like 'spl-%') 
  )

  Select * from cte where [Row_Num]=1

【讨论】:

  • [Row_Num] 是 cte 新添加的列。从 Select * from cte where [Row_Num]=1 中删除 where 条件并检查 cte 中是否存在 Row_Num
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
相关资源
最近更新 更多