1

私は同様のデータを持つテーブルを持っています:

Col1 ; Col2;
G11  ; 112;
G11-1; 0;
G11-2; 2;
G12-2; 111;

G11-rows col2 を単純な G11 col2 で更新したいのですが、単純な G12 行がない場合は G12 rows を変更したくありません。

4

3 に答える 3

3
UPDATE 
    tableX AS upd
  JOIN
    tableX AS simple
      ON  simple.Col1 NOT LIKE '%-%'
      AND upd.Col1 LIKE CONCAT(simple.Col1, '-%')
SET
    upd.Col2 = simple.Col2 ;

SQLフィドルでテスト済み


このクエリは、何も更新せずに意図した編集を表示します。

SELECT upd.Col1, upd.Col2, 
       simple.Col1 AS simpleCol1, simple.Col2 AS New_value
FROM 
    tableX AS upd
  JOIN
    tableX AS simple
      ON  simple.Col1 NOT LIKE '%-%'
      AND upd.Col1 LIKE CONCAT(simple.Col1, '-%') ;
于 2013-01-04T10:06:46.260 に答える
2

sqlfidle を作成した @Ypercube の功績。を使用して検証を行う別の方法を次に示しinstrます。少し速いようです。

選択クエリのみ。更新クエリにもinstr構文を含めることができます。

SELECT *
FROM tableX ;

SELECT upd.Col1, upd.Col2, 
       simple.Col1 AS simpleCol1, simple.Col2 AS New_value
FROM 
    tableX AS upd
  JOIN
    tableX AS simple
      ON  instr(simple.Col1 ,'-') = 0
      AND upd.Col1 LIKE CONCAT(simple.Col1, '-%') ;

結果:

COL1    COL2    SIMPLECOL1  NEW_VALUE
G11-1   0   G11         112
G11-2   2   G11         112
于 2013-01-04T10:59:56.700 に答える
0

Ypercube のソリューションは正しくクリーンであり、bonCodigo のアイデアは素晴らしいです! しかし、どちらももう少し単純化できます。この条件が true を返す場合:

upd.Col1 LIKE CONCAT(simple.Col1, '-%')

upd.Col1これは、に (少なくとも)-よりも1 つ多く含まれていることを意味し、サンプル データのようにsimple.Col11 つだけ-が許可されている場合は、まだ含まれsimple.Col1ていない-ため、これらの条件は両方とも冗長です。

ON simple.Col1 NOT LIKE '%-%'
ON instr(simple.Col1 ,'-') = 0

しかし、私は を使用するというアイデアが気に入っています。INSTR常に を代用できるわけではありませんが、代用LIKEできる場合は高速になります。SELECT クエリを次のように記述します。

SELECT
  upd.Col1,
  upd.Col2, 
  simple.Col1 AS simpleCol1,
  simple.Col2 AS New_value
FROM 
  tableX AS upd JOIN tableX AS simple
  ON instr(upd.Col1, concat(simple.Col1, '-'))

UPDATEクエリは非常に似ています。これは他の回答の統合にすぎないため、アイデアのために全員に+1を与えています:)

于 2013-01-04T12:06:00.137 に答える