21

与えられた構造のテーブルがあります。次に、ステータス1からステータス2に2xx製品を転送するクエリを作成します。子コードは現在私には関係ありません。

master_code| child_code | status_code
-----------|------------|------------
    xx     |    xx1     |     1
    xx     |    xx2     |     1
    xx     |    xx3     |     1
    xx     |    xx4     |     2
    xx     |    xx5     |     2
    yy     |    yy1     |     3
    yy     |    yy2     |     2
    zz     |    zz1     |     1
    zz     |    zz2     |     1

基本的なチェックを実装しました。

update only product_child
set product_status=1
where product_status=2

3つのxxすべてにコード2があり、それを制御したいのですが、このコマンドでコードが変更されるのは1つのxxだけだと思っていました。

4

4 に答える 4

34

どの行が更新されるかを気にしない場合、私は非常に用心深いことを行います (実際には、このためにテーブルに PK を追加してください)、次のようなものを使用できます。

UPDATE
    product_child
SET
    product_status = 1
WHERE
    CTID IN ( SELECT CTID FROM product_child WHERE product_status = 2 and master_code = 'xx' LIMIT 1 )

CTID は一意の行識別子です。副選択を 1 レコードに制限することで、WHERE 句を満たす行に対応する 1 つの CTID が返されます。

于 2012-07-11T12:10:20.150 に答える