0

次のようなジャンクション テーブルを作成しました。

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

私は、いくつかの行を選択できるクエリを見つけようとしていました-に基づいてPokémonID-そして、主要な「フィルタリング」の後に最初または2番目の行のみを更新します。

例えば:

を含む 2 行目の TypeID の値を変更したいとしますPokémonID = 2UPDATE KantoType SET TypeID = x WHERE PokémonID = 2両方の行が変更されるため、単に使用することはできません!

INEXISTSおよびを含むサブクエリを使用しようとしましLIMITたが、成功しませんでした。

4

4 に答える 4

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 2行だけにしたい場合は、次のように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

テーブル内の 1 行だけを更新する必要がある場合は、次のように提案できます。

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 に答える