【发布时间】: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;联系。 -
gameIdNULLable,有没有可能?如果是这样,这就是documented 行为(见大红框)。请改用NOT EXISTS。老实说,我经常认为首先使用(NOT) EXISTS通常是更好的选择。 -
@marc_s 如果我在没有 INSERT INTO 部分的情况下运行它,它确实返回 90 行
-
您应该为
INSERT语句指定列列表,以确保您插入到正确的列中。 -
考虑到,除了
SELECT和前面的INSERT INTO子句中的列之外,这些语句是相同的,这表明你的问题是什么,你在做什么是不相等的.我认为是minimal reproducible example 的时间。
标签: sql sql-server tsql sql-server-2012