SQL Server中的选择性更新

时间:2013-01-10 13:41:17

标签: sql sql-server select junction-table

我创建了一个像这样的联结表:

http://imageshack.us/scaled/landing/822/kantotype.png

我试图找出一个能够选择某些行的查询 - 基于PokémonID - 然后只更新主要“过滤”之后的第一行或第二行。

例如:

假设我想从包含PokémonID = 2的第二行更改TypeID的值。我不能简单地使用UPDATE KantoType SET TypeID = x WHERE PokémonID = 2,因为它会改变两行!

我已经尝试使用包含INEXISTSLIMIT的子查询,但没有成功。

4 个答案:

答案 0 :(得分:0)

目前还不清楚你想做什么。但是,UPDATE JOIN可以这样:

UPDATE 
SET k1.TypeID = 'somethng' -- or some value from k2
FROM KantoType k1
INNER JOIN
(
   Some filtering and selecting
) k2 ON k1.PokémonID = k2.PokémonID 
WHERE k1.PokémonID = 2;

或者:如果您想UPDATE只有PokémonID = 2这两行,您可以这样做:

WITH CTE
AS 
(
   SELECT *,
     ROW_NUMBER() OVER(ORDER BY TypeID) rownum
   FROM KantoType
   WHERE PokemonID = 2
) 
UPDATE c 
SET  c.TypeID = 5
FROM CTE c
WHERE c.rownum = 1;

SQL Fiddle Demo

答案 1 :(得分:0)

如果您只需更新表格中的一行,我可以建议这样的内容:

UPDATE kantotype
SET 
  type = 2
WHERE pokemon = 2
AND NOT EXISTS (SELECT * FROM kantotype k2 
                WHERE kantotype.type > k2.type
                   AND kantotype.pokemon = k2.pokemon)

如果表格中有唯一标识符字段,那么获取表格的第一个或最后一个项目会更容易。

答案 2 :(得分:0)

即使你试图通过在TypeID上执行主要过滤来更新PokemenID = 2的行,也不确定...所以只是出于假设(大一点),你可以尝试一下在Case

UPDATE yourtable a
LEFT JOIN youtable b on a.pokeid = b.pokeid
SET a.typeid = (CASE
   WHEN a.typeid < b.typeid THEN yourupdatevalue
   WHEN a.typeid > b.typeid THEN someothervalue   
   ELSE a.typeid END);

答案 3 :(得分:0)

如果您知道口袋妖怪ID和类型ID,那么只需将两者都添加到查询的where子句中。

UPDATE KantoType 
SET TypeID = x 
WHERE PokémonID = 2
AND TypeID=1

如果您不知道类型ID,那么您需要提供有关您要完成的内容的更多信息。目前尚不清楚为什么你没有这些信息。

或许想一想数据集中的唯一标识符是什么。