1

別のテーブルのデータでテーブルを更新しようとすると、2つのテーブル間の関係は1対多の関係になります。ここに例を示しました。

UPDATE
    foo f
INNER JOIN 
    bar b 
ON 
    b.fooId = f.Id 
SET
    f.something1 = b.barSome1,
    f.something2 = b.barSome1, 
    f.something3 =  b.barSome1, 
    f.something4 = b.barSome1

しかし、私の例では途中までしか進みません。私がやりたいのは、最新のbar.post_dateまたはbar.Idに基づいて上位1つのバーを選択するか、bar.barSome1(varcharとしましょう)がnullまたは空かどうかを確認することです。

今は私のバーの内部注文です

4

1 に答える 1

0

したがって、変更する行WHEREを制限する句を追加する必要があります。foo

UPDATE
    foo f
INNER JOIN 
    bar b 
ON 
    b.fooId = f.Id 
SET
    f.something1 = b.barSome1,
    f.something2 = b.barSome1, 
    f.something3 =  b.barSome1, 
    f.something4 = b.barSome1
WHERE 
  /* only the latest foo.Id */
  f.Id = (SELECT MAX(Id) FROM foo)
  /* Or f.barSome1 is NULL or an empty string */
  OR (f.barSome1 IS NULL OR f.barSome1 = '')

最新のものでそれを行うにはpost_date、次のような構成を使用します。

WHERE
  f.id = (SELECT id FROM (SELECT id, post_date FROM foo HAVING post_date = MAX(post_date)) AS maxpost)
  OR (f.barSome1 IS NULL OR f.barSome1 = '')

アップデート

fooの単一の行から一致基準を持つのすべての行を変更するには、句barなしでサブクエリに対して結合を使用できます。ON最初にSELECTステートメントを使用してこれをテストします。 私はこのようなことを試したことがなく、fooテーブルが破壊された場合の責任は負いません。:)最初にバックアップします。

JOINをテストする

SELECT f.*, barsub.*
FROM 
  foo f
  JOIN (SELECT * FROM bar WHERE Id = (SELECT MAX(Id) FROM bar)) barsub

UPDATEは同じように機能するはずです

UPDATE foo f
/* subquery returns one row so all rows of foo are joined to it */
JOIN (SELECT * FROM bar WHERE Id = (SELECT MAX(Id) FROM bar)) barsub
/* no ON clause */
SET
   f.something1 = barsub.barSome1,
   f.something2 = barsub.barSome1, 
   f.something3 = barsub.barSome1, 
   f.something4 = barsub.barSome1
于 2012-04-11T14:15:05.703 に答える