1

データの参照セットを含むmySQLテーブルがあります。この参照データの更新または追加エントリを説明するデータを含む別のテーブルがあります。さまざまな理由から、ここでは説明しませんが、特定のユーザーがやって来てレコードを作成するときに、参照データが変更されないようにすることが重要です(したがって2番目の表)。これらのテーブル間のスキーマは、2キーの複合主キーを持つ「カスタム」テーブルを除いて同じです。これらの列の1つは、「カスタム」テーブルと参照テーブルの間で共有されます。

これらのテーブルで単一のSQLステートメントで実行したいビジネスロジックは次のとおりです。

参照テーブルにあるものと同じキー値を持つレコードが「カスタム」テーブルに存在する場合は、「カスタム」を使用します。それ以外の場合は、参照値を取得します。

RIGHT JOINを使用したり、UNIONオペレーターを少しひねって戻ってくるものを制御したりできるのではないかと思いました。しかし、私はSQLのロジックをスクランブリングし続けています。JOINは、一方のテーブルから情報をフェッチして、もう一方のテーブルと結合しますが、これは私が実際に探しているものではありません。UNIONは、テーブル間の重複を削除するだけです。

何かのようなもの:

SELECT*FROMカスタムUNIONSELECT*FROMリファレンス

これを除いて、すべての列が同じである場合、単に重複を削除します。いずれかが異なる場合(カスタムエントリが存在するために存在するため)、UNIONは両方のテーブルの内容をまとめる以外に何もしません。

私はこれについてすべて間違っていますか?

あなたが提供できる洞察に感謝します。

4

3 に答える 3

3

これを行うにはいくつかの方法があります。少なくともあなたの状況の私の解釈によれば、あなたが必要とするものを手に入れるべき組合はここにあります:

select KeyCol, Col2, Col3
from CustomTable
union all
select KeyCol, Col2, Col3
from RefTable
where KeyCol not in (select KeyCol from CustomTable)

RefTableとCustomTableには1対0または1の関係があると想定しています。たとえば、どのRefにも複数のカスタムレコードはありません(ただし、これはどちらの方法でも機能します)。

アップデート:

カスタムの追加のキー列が必要になる場合もあります。

select KeyCol, Col2, Col3, CustomKey
from CustomTable
union all
select KeyCol, Col2, Col3, null as CustomKey
from RefTable
where KeyCol not in (select KeyCol from CustomTable)
于 2012-07-12T20:35:15.990 に答える
1

右と左の値のCOALESCE()との左外側の結合のように聞こえます。

SELECT COALESCE(c.val, r.val) as val, ...
FROM reference as r LEFT OUTER JOIN custom as c ON c.ID = r.ID AND c.Project = 'ProjectX'
于 2012-07-12T20:33:59.517 に答える
0

@TimLehnerに帰属する場合、おそらく必要なのは、彼のクエリを少し変更することです。私の推測では、最新の顧客の変更が必要だと思います。さらに、これには最大のカスタムキーがあると思います。

これを取得するには、クエリに別の句が必要です。

select KeyCol, Col2, Col3, CustomKey
from CustomTable ct join
     (select max(CustomKey) as maxCustomKey from CustomTable group by KeyCol, Col2 Col3
     ) lastkey
     on ct.KeyCol = lastkey.KeyCol and ct.Col2 = lastkey.Col2 and ct.Col3 = lastkey.Col3
union all
select KeyCol, Col2, Col3, null as CustomKey
from RefTable
where KeyCol not in (select KeyCol from CustomTable)

ちなみに、他のほとんどのデータベースでは、より単純なクエリとrow​​_number()という関数を使用してこれを行いますが、mysqlはこのタイプの関数をサポートしていません。

于 2012-07-12T21:56:28.547 に答える