4

私は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 を変更する必要があるかもしれないと考えていますが、完全にはわかりません。

4

2 に答える 2

8

WHERE句を結合に移動します...

select 
  TableA.name,
  TableA.startDate,
  TableA.endDate,
  TableA.Reason,
  TableA.id1,
  COALESCE(TableC.ReasonName, 'No Reason') AS FilteredReasonName
from
  TableA
left join
  TableB
    on  TableA.id1 = TableB.id1
    and TableB.id2 = 'asd1f5as98a4'
left join
  TableC
    on  TableB.id2 = TableC.id2

現在、TableB (重複のソース)は、 ReasonFであるか、まったくない場合にのみ参加します。次に、次の結合が行われ、そのコードのReasonNameが検索されます。

何も見つからない場合、COALESCE()はNULLを。に置き換えます'No Reason'

于 2012-10-16T13:46:03.960 に答える
1

私があなたが正しく欲しいものを理解しているなら....

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 and TableC.id2 = 'asd1f5as98a4'
于 2012-10-16T13:45:13.867 に答える