私は、LEFT JOINの望ましい効果を無効にするWHERE句の制限の問題をすべて含む、非常によく似た質問を見つけました。しかし、私はそれらの問題と答えを自分の状況に拡張することはできません.
右側の一致に関係なく、左側のテーブルのすべてのレコードが必要です。正しいテーブルに一致するものがある場合、複数の一致がある可能性が高いため、サブクエリを実行して正しいものを取得します。
左側のテーブルには各行のキーと請求期間名があり、右側のテーブルには同じキーと日付のトランザクションがあります。キーが一致する場合は、一致する左側のテーブル レコードの対応する請求期間の最新の取引日を持つ右側のテーブルからレコードのみを返す必要があります。
したがって、正しいテーブルから一致する正しいレコードを選択するための WHERE ステートメントはサブクエリであるため、LEFT JOIN の ON 部分にそれを挿入することはできません。
私の次のアプローチは、先に進んで内部クエリとして実行し、それらの結果を 2 番目のクエリで UNION して、一致しない左テーブルのレコードを取得することです。ひどい話に聞こえるかもしれませんが、私はブルート フォース アプローチをよく知っています。
key1 billing_period key2 date value
1 period_1 1 date_1 a1
2 period_1 1 date_2 a2
3 period_1 1 date_3 a3
4 period_1 3 date_1 a4
3 date_4 a6
望ましい出力は
1 period_1 date_2 a2
2 period_1
3 period_1 date_4 a6
4 period_1
a) 左のテーブルのすべてのレコードが必要であり、b) date_2 は、キー値 1 を持つものの中から選択する正しい日付であり、date_4 は、キー値 3 で一致するすべての利用可能な日付の基準を満たしているためです。 . これらの日付は、それぞれの period_x 内に収まる最新の日付です。
疑似コードは、「一致する key1 = key2 がある場合、そのようなすべての一致に対して、billing_period 内の最新の日付を持つものを返します。まったく一致しない場合は、左側のテーブル レコードを返すだけです。