2011-02-04 4 views
1

これは説明が難しいので、最善を尽くします。MySQLのマージクエリーに参加する - 同じテーブルの2つの行を上書きまたはマージする

Iは、(非NULLspecificSiteID Sによって示される。)は、デフォルトの行から成るテーブルを持っている(NULLspecificSiteIDによって示される)および行をオーバーライド

行の両方のタイプは、負荷のかかっているデータを決定するgenericIDを使用します - 一部のデータにはデフォルトがないことがあります。

編集1: Null以外のspecificSiteIDは、私が照会しているサイトIDとサイトIDが一致するときにデフォルト値を上書きするだけです。すべてのオーバーライドを1つのデフォルトに適用するのではなく、specificSiteIDのオーバーライドをデフォルトに適用するだけです。 終了編集1

私はこのクエリの4つの要件があります

  1. 戻るデフォルトもライン固有の上書きもない存在していないデータを。
  2. デフォルトデータがない場合、オーバーライドデータを返します。
  3. オーバーライドデータがnullでないデフォルトデータを上書きします。
  4. 、最後に、オーバーライドデータが存在しない場合はデフォルトデータのみを返します。

は今、私のSQLクエリが

SELECT COALESCE(override.Col1 , default.Col1) as Col1, 
COALESCE(override.Col2, default.Col2) as Col2 
FROM 
    (SELECT * from tableA where 
    genericID = 84 AND 
    specificSiteID IS NULL) as default 
LEFT JOIN 
    (SELECT * from tableA where 
    genericID = 84 AND 
    specificSiteID = 34) as override 
ON default.genericID = override.genericID; 

like--に見えるこのスクリプトの問題は#2が原因LEFT JOINに失敗したような場合です。 LEFT JOINのデフォルト行がない場合、オーバーライド行は含まれません。上記の例を使用して、 = 84の場合、specificSiteIDNULLの場合、オーバーライドデータがあってもデータは返されません。

どのような種類のJOINですか? JOINでこれをカバーできますか?

+0

のためのより適切ではないようだ、私は、DB側のプログラミングではなく、データの合体を扱うことにしました。 – SoreThumb

答えて

1

Mysqlは完全結合をサポートしていませんが、「左結合」+「右結合」を使用してシミュレートできます。

genericID 34とspecificSiteID 84は例であり、specificSiteIdがnull(デフォルト)で、null(上書き)でないすべてのgenericIDの結合が必要だと思いますか?

SELECT COALESCE(override.Col1 , default.Col1) as Col1, 
     COALESCE(override.Col2, default.Col2) as Col2 
    FROM (SELECT * from tableA where specificSiteID IS NULL) as default 
     LEFT JOIN (SELECT * from tableA where specificSiteID is not null) as override 
       ON default.genericID = override.genericID 
UNION 
SELECT COALESCE(override.Col1 , default.Col1) as Col1, 
     COALESCE(override.Col2, default.Col2) as Col2 
    FROM (SELECT * from tableA where specificSiteID IS NULL) as default 
     RIGHT JOIN (SELECT * from tableA where specificSiteID is not null) as override 
       ON default.genericID = override.genericID 

しかし、このクエリを探していることは、あなたのDB設計は、この時点で、あなたのケース

+0

あなたの質問に答えるには、 'genericID'とヌル' specificSiteID'に一致する行を 'genericID'と一致する行と、指定されたIDと一致する' specificSiteID'に参加させるだけです。例:私の例で特定のサイトIDが86であれば、私は多くの場合ではなく、最大で2行しか収集しません。 **次の**:私はそれが適用されているかどうかを確認するためにあなたが提供したコードを見ましたが、おそらく私は最初の説明で間違っていました。私はそれを編集しようとします。 :)(+1、btw!ありがとう!) – SoreThumb

関連する問題