从相当大的SQL Server表中删除重复行的最佳方法是什么(即300,000多行)?
当然,由于RowID身份字段的存在,行不会是完美的重复.
MyTable的
RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null
Run Code Online (Sandbox Code Playgroud) story_category我的数据库中有一个表有损坏的条目.下一个查询返回损坏的条目:
SELECT *
FROM story_category
WHERE category_id NOT IN (
SELECT DISTINCT category.id
FROM category INNER JOIN
story_category ON category_id=category.id);
Run Code Online (Sandbox Code Playgroud)
我试图删除它们执行:
DELETE FROM story_category
WHERE category_id NOT IN (
SELECT DISTINCT category.id
FROM category
INNER JOIN story_category ON category_id=category.id);
Run Code Online (Sandbox Code Playgroud)
但我得到了下一个错误:
#1093 - 您无法在FROM子句中为更新指定目标表'story_category'
我怎么能克服这个?
假设我有一个表格,其中包含有关a的信息
game (PRIMARY INT id, TINYINT offline)
Run Code Online (Sandbox Code Playgroud)
和第二个表格,其中包含有关该游戏的详细信息:
gamedetail (PRIMARY INT id, INT game_id (fk to game table), TINYINT offline)
Run Code Online (Sandbox Code Playgroud)
细节经常更新,并从各种程序.在那里我设置了细节的离线标志.我没有编程设置游戏本身的离线标志的可能性.(我确实将游戏的离线标志设置为0,但是,如果我找到在线详细信息).但我想通过更新查询在数据库中设置此信息.这个想法是这个SELECT:
SELECT DISTINCT game.id FROM game
LEFT JOIN gamedetail AS gdon
ON (gdon.game_id = game.id AND gdon.offline = 0)
LEFT JOIN gamedetail AS gdoff
ON (gdoff.game_id = game.id AND gdoff.offline = 1)
WHERE gdoff.id IS NOT NULL AND gdon.id IS NULL;
Run Code Online (Sandbox Code Playgroud)
这给了我很好的所有游戏,我只有离线游戏细节.所以我想将此作为UPDATE语句的输入,如下所示:
UPDATE game SET game.offline=1 WHERE game id IN (
SELECT DISTINCT game.id FROM game
LEFT JOIN gamedetail AS …Run Code Online (Sandbox Code Playgroud)