1

一意の列(sal_id、gal_id、amount、tax)を持つ2つのテーブルACTUAL AND ESTIMATEがあります。

ACTUAL テーブルには、actual_id、sal_id、gal_id、process_flag、amount、tax
1 111 222 N 100 1
2 110 223 N 200 2があります。

ESTIMATE テーブルには、estimate_id、sal_id、gal_id、process_flag、amount、tax
3 111 222 N 50 1
4 123 250 N 150 2 5 212 312 Y 10 1があります。

ここで、ACTUAL テーブルのレコードが必要な最終テーブルが必要です。ACTUAL の sal_id+gal_id マッピングのレコードが存在しないが、ESTIMATE に存在する場合は、見積もりレコードを入力します (金額と税金の追加と共に)。

FINAL テーブル
ID sal_id、gal_id、actual_id、estimate_id、total
1 111 222 1 null 101 (111 222 のレコードが実際のテーブルに存在するため)
2 110 223 2 null 202 (110 223 のレコードが実際のテーブルに存在するため)
3 123 250 null 4 51 (実際のテーブルにはレコードが存在しないが、123 250 の見積もりが存在するため)

(212 312 の組み合わせの見積もりの​​場合、レコードは既に処理されているため、再度処理する必要はありません)。

Oracle 11g を使用しています。単一のSQLクエリでロジックを書くのを手伝ってください?

ありがとう。

4

1 に答える 1

1

このクエリを記述する方法はいくつかあります。1 つの方法は、結合と合体を使用することです。

select coalesce(a.sal_id, e.sal_id) as sal_id,
       coalesce(a.gal_id, e.gal_id) as gal_id,
       coalesce(a.actual_value, e.estimate_value) as actual_value
from actual a full outer join
     estimate e
     on a.sal_id = e.sal_id and
        a.gal_id = e.gal_id

これは、sal_id/gal_id がテーブル間の一意の一致を提供することを前提としています。

Oracle を使用しているため、おそらくより明確な方法を次に示します。

select sal_id, gal_id, actual_value
from (select *,
             max(isactual) over (partition by sal_id, gal_id) as hasactual
      from ((select 1 as isactual, *
             from actual
            ) union all
            (select 0 as isactual, *
             from estimate
            )
           ) t
     ) t
where isactual = 1 or hasactual = 0

このクエリは、ウィンドウ関数を使用して、一致する sal_id/gal_id を持つ実際のレコードがあるかどうかを判断します。ロジックは、すべての実績を取得してから、実績に一致しないすべてのレコードを取得することです。

于 2012-07-28T14:34:23.200 に答える