0

table1 と table2 の 2 つのテーブルがあります。テーブル 2 の行数はテーブル 1 よりも少なくなっています。これら 2 つのテーブルには、table1 の caldate1 と table2 の caldate2 という 2 つの日付列があります。したがって、これら 2 つのテーブルを結合して、2 つの日付列の最大値を取得し、それを新しいテーブルに保持する必要があります。しかし、これらの 2 つのテーブルを内部結合すると、table2 にない table1 行は最終テーブルに入りません。したがって、次のようなものが必要です

table1 
left outer join
table2

しかし、2 つの日付が null になっている状況があります。したがって、合体を使用して、以下のシナリオで正しいデータを取得できますか..

1. table1 の行が table2 にない -> table1 の caldate1 は最終テーブルに入る必要があります。

2. table1 の行は table2 にあり、table1 の caldate1 と table2 の caldate2 は null です - > null は最終テーブルの日付列に入る必要があります

3. table1 の行は table2 にあり、caldate1 は null ではなく、caldate2 は null -> caldate1 は最終テーブルに入る必要があります。

4. table1 の行が table2 にあり、caldate1 が null で caldate2 が null でない場合 -> caldate2 が最終テーブルに入る必要があります

5. table1 の行が table2 にあり、caldate1 が caldate2 より大きい -> caldate1 が最終テーブルに入る必要がある

6. table1 の行が table2 にあり、caldate2 が caldate1 より大きい -> caldate2 が最終テーブルに入る必要がある

table1 と一致しない table2 の行を考慮する必要はありません。したがって、基本的に、特定の行が両方のテーブルにある場合、最新のカルデートを持つすべての table1 行が必要です。前もって感謝します。それを行うための正しい関数を取得できません。合体しますか?

4

2 に答える 2

1

上記のクエリから、 table1にはなくtable2に存在する番号がある場合、それらのレコードは削除されます。上記のクエリでは完全外部結合を使用できます。

または以下のクエリを参照して、そのシナリオもカバーします。

sel number,max(date1) from (
  sel number,max(caldate1) as date1
    from table1
  union
  sel number,max(caldate2) as date1
    from table2
)tmp ;
于 2012-05-28T15:25:26.800 に答える
0

私の要件を満たすために、以下のようなことを考えています。

SELECT 
a.number,
CASE WHEN ZEROIFNULL(a.caldate1) > ZEROIFNULL(b.caldate2)
THEN a.caldate1  -- This is working
ELSE
b.caldate2
END AS caldate
/*COALESCE (a.caldate1,caldate2) AS caldate*/ -- This is not giving max of dates
FROM 
table1  a
LEFT OUTER JOIN
table2  b
ON
a.number = b.number

助けてくれてありがとう。これで上記の方法で完了です。

于 2010-01-22T04:27:13.600 に答える