3

私は、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 内の最新の日付を持つものを返します。まったく一致しない場合は、左側のテーブル レコードを返すだけです。

4

2 に答える 2

2

基本的に、条件付きの左結合が必要です。

A LEFT JOIN B
WHERE B.SomeColumn IS NULL OR (some condition)
于 2013-11-08T06:45:40.537 に答える
0

結合自体に条件を設定する方法が見つかりませんでした。実際、私にとって解決策の鍵は、条件がまったくないことを確認することでした。したがって、ここで重要なのは、結合を試みる前に、正しいテーブルが正しいテーブルであることを確認することでした。

この問題について、最初に(疑似)クエリを実行しました

SELECT key, value, bp.period as period
FROM rtable, bp
WHERE rtable.date = (SELECT max(rtable2.date) from rtable2, bp2
    WHERE rtable2.date BETWEEN bp2.start AND bp2.end
    AND bp2.period = bp.period)

次に、この AS [alias] ON キーとピリオドで LEFT JOIN を実行しました。完璧に機能したようです。

問題文では、実際にはこれらの日付を表示する必要がないのに、右側のテーブルの日付値を出力として含めました。私の側の問題定義が不十分です。次回は、この例についてもっと時間をかけて説明します。

于 2013-11-15T19:20:48.577 に答える