【问题标题】:My insert statement is not inserting any rows我的插入语句没有插入任何行
【发布时间】:2022-01-09 22:03:34
【问题描述】:

我有两个如下所示的表:

  • game(ID、标题、位置)
  • gamePlayers (playerType, gameId)

我可以看到我有 90 个游戏在我的 gamePlayers 表中没有对应的 id 使用此查询:

SELECT * 
FROM dbo.game
WHERE id NOT IN (SELECT gameId FROM dbo.gamePlayers)

所以我想为丢失的游戏创建条目,并为playerType 添加值“1”,为gameId 添加游戏ID。

所以我尝试了这个:

INSERT INTO dbo.gamePlayers
    SELECT 1, p.id 
    FROM dbo.game p
    WHERE p.id NOT IN (SELECT gameId FROM dbo.gamePlayers)

但它根本没有插入任何东西。

不应该插入90行吗?

谢谢!

【问题讨论】:

  • 您有任何 NULL 游戏 ID 值吗?在这种情况下,NOT IN 永远不会返回 true。请与SELECT gameId FROM dbo.gamePlayers WHERE gameId IS NULL;联系。
  • gameId NULLable,有没有可能?如果是这样,这就是documented 行为(见大红框)。请改用NOT EXISTS。老实说,我经常认为首先使用(NOT) EXISTS 通常是更好的选择。
  • @marc_s 如果我在没有 INSERT INTO 部分的情况下运行它,它确实返回 90 行
  • 您应该为INSERT 语句指定列列表,以确保您插入到正确的列中。
  • 考虑到,除了SELECT 和前面的INSERT INTO 子句中的列之外,这些语句是相同的,这表明你的问题是什么,你在做什么是不相等的.我认为是minimal reproducible example 的时间。

标签: sql sql-server tsql sql-server-2012


【解决方案1】:

以下轻微的重构对你有用吗?

insert into dbo.gamePlayers(playerType, gameId)
select 1, p.id 
from dbo.game p
where not exists (select * from gamePlayers gp where gp.gameId=p.Id)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-21
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-08
    相关资源
    最近更新 更多