【问题标题】:INSERT INTO SELECT query in SQL where primary key is used and multiple duplicates are in another table [duplicate]在使用主键且多个重复项在另一个表中的 SQL 中插入 INTO SELECT 查询[重复]
【发布时间】:2018-12-13 08:11:45
【问题描述】:

我是 sql server 的新手。 我有两个表[FLT_SKDL] 有多个重复数字,[SHIP] 使用主键并且只想插入一个 ID。 我想在我的 [SHIP] 表中插入从[FLT_SKDL][SHIP] 的数据,其中使用了主键,所以我应该忽略我使用以下语法的重复项。

INSERT  INTO DB01TD02.BRIC.SHIP
SELECT SHIP_NO, SHIP_TYPE_IATA, SHIP_TYPE_DIA, SHIP_TYPE_ICAO, SYSDATETIME(),'EMP', 'BRIC', SYSDATETIME(),'EMP', 'BRIC'
FROM  DB01TD02.BRIC.FLT_SKDL 
WHERE NOT EXISTS(SELECT SHIP_NO FROM DB01TD02.BRIC.SHIP  WHERE DB01TD02.BRIC.SHIP.SHIP_NO = DB01TD02.BRIC.FLT_SKDL.SHIP_NO)
AND DB01TD02.BRIC.FLT_SKDL.SHIP_NO IS NOT NULL 

我试过了

Avoid duplicates in INSERT INTO SELECT query in SQL Server

但在我的情况下不起作用。 有没有其他解决方案。 在此先感谢

【问题讨论】:

  • 定义“但没用”
  • @CaiusJard 我尝试了该链接的所有答案(例如 NOT EXISTS、NOT IN、JOIN/IS NULL)
  • 以后当你问一个问题时,不要只说“但它不起作用”——说出什么不起作用;错误信息来了?你要的船不在那里?你的电脑爆炸了?什么?我们不是读心术的人,说“它不起作用”对我们没有任何意义;您可以通过描述它的功能以及您希望它做什么以及为什么这两件事不同(如果不明显)来说明为什么它不起作用
  • @CaiusJard 抱歉,非常感谢您的建议。我会从下一次做

标签: sql database sql-insert


【解决方案1】:

我通常使用左连接模式执行“插入尚未存在的位置”:

INSERT INTO DB01TD02.BRIC.SHIP (put,a,list,of,columns,here,please)
SELECT f.SHIP_NO, f.SHIP_TYPE_IATA, f.SHIP_TYPE_DIA, f.SHIP_TYPE_ICAO, SYSDATETIME(), 'EMP', 'BRIC', SYSDATETIME(),'EMP', 'BRIC'
FROM  
  DB01TD02.BRIC.FLT_SKDL f
  LEFT JOIN
  DB01TD02.BRIC.SHIP s 
  ON DB01TD02.BRIC.SHIP.SHIP_NO = DB01TD02.BRIC.FLT_SKDL.SHIP_NO
WHERE
  s.SHIP_NO is null

我怀疑你的实际问题是 FLT_SKDL 包含一些重复 SHIP_NO 的行

如果上述查询不起作用,请使用以下查询来识别重复的船只并删除其中一个重复项:

SELECT * FROM DB01TD02.BRIC.FLT_SKDLWHERE ship_no IN( 
  SELECT ship_no FROM DB01TD02.BRIC.FLT_SKDL GROUP BY ship_no HAVING COUNT(*)
)

【讨论】:

  • 是的,FLT_SKDL 表中有很多重复的 SHIP_NO
  • 那么,你不能将它们插入到 SHIP 中,因为 SHIP 在 SHIP_NO 上有一个主键。决定要保留哪些行。或者通过一些只考虑一艘船的规则,比如f.ShipIsActive = 1,或者通过从f表中删除重复项,或者通过更改执行插入的查询,使其看起来更像WHERE s.ship_no IS NULL AND f.SHIP_NO NOT IN (...list of ship no to exclude...)或类似的
  • 我试过 f.SHIP_NO NOT IN(select s.SHIP_NO from DB01TD02.BRIC.FLT_SKDL) 但结果是 (0 行已处理)乙>。我如何列出要排除的船舶编号,因为 ship_no 可以是 10 个字符内的任何内容
  • 像这样:NOT IN('abc123', 'def456' ...)
猜你喜欢
  • 2016-08-04
  • 2013-02-28
  • 2011-01-31
  • 2014-12-26
  • 2017-12-10
  • 2012-08-07
  • 2020-03-16
  • 2020-03-17
  • 2014-04-22
相关资源
最近更新 更多