0

我创建了一个像这样的连接表:

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

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

例如:

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

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

4

4 回答 4

0

目前尚不清楚您要做什么。但是,您可以UPDATEJOIN这样:

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 小提琴演示

于 2013-01-10T13:44:23.440 回答
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);
于 2013-01-10T14:04:37.850 回答
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)

如果表中有唯一标识符字段,则更容易获取表的第一项或最后一项。

于 2013-01-10T13:57:08.453 回答
0

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

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

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

也许考虑一下数据集中的唯一标识符是什么。

于 2013-07-11T13:36:34.147 回答