3

newtableのストアIDをここのmaintableのIDと同期しようとしています:

UPDATE newtable t SET t.store_id = (SELECT store_id FROM maintable s 
WHERE t.state = s.state AND s.city = t.city AND t.name = s.name)

サブクエリが複数の行を返す場合は常に「サブクエリは複数の行を返します」とエラーになりますが、ゼロ行を返す場合、サブクエリは何も返さなかったと見なされるため、newtableのstore_idはNULLのままです。ここでは何も新しいことはありません、それはそれがどのように機能するかです。

一致する行が複数ある場合に、一致するものがない場合と同じようにサブクエリを出力できるかどうかを知りたいのですが。

このようにして、メインテーブルの1つの一致する行に対してのみstore_idを同期し、サブクエリで複数の一致する行が出たときにスキップします。

4

3 に答える 3

6

クエリを1回だけ一致させるためのHAVING句を探していると思います。

UPDATE newtable t
SET t.store_id = (
    SELECT store_id
    FROM maintable s
    WHERE t.state = s.state
      AND s.city  = t.city
      AND t.name = s.name
    HAVING COUNT(*) = 1
)

これにより、複数の一致が一致なしと同じように動作するようになります。HAVING句は、クエリプロセスのほぼ最後に適用されます。WHEREからの一致がない場合、または複数の一致がある場合COUNT(*) = 1は失敗し、内部クエリは何も返しませんが、行が1つだけの場合COUNT(*) = 1は成功し、内部クエリはその単一の一致を返します。

于 2011-07-13T03:16:52.943 に答える
0

LIMIT 1特定のニーズに応じて、サブクエリにを入れて、達成しようとしていることをより適切に達成することを検討してください。

それ以外の場合は、IFまたはCASEでクリエイティブになることができるはずです。

UPDATE newtable t SET t.store_id = (
    SELECT IF(num>1, NULL, storeid) FROM (
        SELECT COUNT(*) AS num, storeid FROM maintable s WHERE t.state=s.state AND s.city=t.city AND t.name=s.name
    )
)

テストされていませんが、球場に入るはずです。

于 2011-07-13T02:49:18.407 に答える
0
UPDATE newtable t SET t.store_id = IFNULL((SELECT store_id FROM maintable s 
WHERE t.state = s.state AND s.city = t.city AND t.name = s.name HAVING COUNT(*) = 1), t.store_id)

IFNULL(use_this_value_if_not_null,value_if_first_isnull)

于 2011-07-13T02:54:53.337 に答える