私は3つのテーブルを持っています。
テーブル A には、クエリの基になるデータが含まれています。id1 が含まれています。テーブル B は接続テーブルです。これには id1 と id2 という 2 つの列が含まれています。
テーブル C はルックアップ テーブルで、id2 と ReasonName が含まれています。「ReasonName」列とテーブル A のすべてのデータが必要です。
次のSQLを実行すると:
SELECT NAME,
STARTDATE,
ENDDATE,
REASON,
ID1
FROM TABLEA
LEFT JOIN TABLEB
ON TABLEA.ID1 = TABLEB.ID1
その後、TableC に 2 回目の参加を行うことができますが、ここに問題があります。TableC には複数の一致があるため、totalrows が増加します。これを避ける必要があります。TableC がどのように見えるかについては、画像を参照してください。
SQL ステートメントが次のようになっている場合:
SELECT TABLEA.NAME,
TABLEA.STARTDATE,
TABLEA.ENDDATE,
TABLEA.REASON,
TABLEA.ID1,
TABLEC.REASONNAME
FROM TABLEA
LEFT JOIN TABLEB
ON TABLEA.ID1 = TABLEB.ID1
LEFT JOIN TABLEC
ON TABLEB.ID2 = TABLEC.ID2
次に、行が約 1000 増加します。これは、TableA.id1 が TableC で見つかった複数の id2 と一致する可能性が高いためです。次に、別の TableC.ReasonName 以外の行を複製します。
TableC には、気になる ReasonName が 1 つあります。この例では、「reasonf」とします。
私が必要としているのは、TableC から ReasonName を取得することですが、reasonf を含むものだけで、残りは NULL にするか、「理由なし」で COALESCE を実行する必要があります。ステートメントに WHERE 句を入れてみました。SQL を参照してください:
SELECT TABLEA.NAME,
TABLEA.STARTDATE,
TABLEA.ENDDATE,
TABLEA.REASON,
TABLEA.ID1,
TABLEC.REASONNAME
FROM TABLEA
LEFT JOIN TABLEB
ON TABLEA.ID1 = TABLEB.ID1
LEFT JOIN TABLEC
ON TABLEB.ID2 = TABLEC.ID2
WHERE TABLEC.ID2 = 'asd1f5as98a4'
しかし、その後、「reasonf」と一致するレコードのみが表示されます。理由のある人を表示し、残りを無視して(nullまたは何かのままにする)、重複はありませんが、完全な結果セット。
正しい結合に変更するか、WHERE を変更する必要があるかもしれないと考えていますが、完全にはわかりません。