我创建了一个像这样的联结表:
http://imageshack.us/scaled/landing/822/kantotype.png
我试图找出一个能够选择某些行的查询 - 基于PokémonID
- 然后只更新主要“过滤”之后的第一行或第二行。
例如:
假设我想从包含PokémonID = 2
的第二行更改TypeID的值。我不能简单地使用UPDATE KantoType SET TypeID = x WHERE PokémonID = 2
,因为它会改变两行!
我已经尝试使用包含IN
,EXISTS
和LIMIT
的子查询,但没有成功。
答案 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;
答案 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,那么您需要提供有关您要完成的内容的更多信息。目前尚不清楚为什么你没有这些信息。
或许想一想数据集中的唯一标识符是什么。