0

3 つの個別のクエリを 1 つに結合しようとしています。各クエリは異なるテーブルから異なる列を選択しますが、テーブルには共通の列がいくつかあります。

私がやろうとしたのは、2 つのテーブルを別のテーブルに LEFT JOIN することでした。これは、一番左のテーブルが結果を返す限りうまく機能します。ただし、一番左のテーブルが結果を返さない場合は、結果はまったく返されません (LEFT JOIN された 2 つのクエリに結果がある場合でも)。

擬似コード:

SELECT a.col_1, b.col_2, c.col_3
FROM tableA a 
LEFT JOIN tableB b ON b.someCol = a.someCol
LEFT JOIN tableC c ON c.someCol = a.someCOL
WHERE a.anotherCol = :someVal AND a.yetAnotherCol = :anotherVal

tableA に結果がある場合、クエリ結果は私が求めているものです (つまり、col_1、col_2|null、および col_3|null を持つ 3 つの列が返されます)。ただし、tableA に結果がない場合、クエリは null を返します。

LEFT JOIN の文字列の左端のテーブルに結果がない場合でも結果を返す方法はありますか?

4

1 に答える 1

3

問題があります。left joinはすべてを最初のテーブルに保持します。full outer joinMySQL がサポートしていないのようなものが必要なようです。しかし、素晴らしい回避策があります。

クエリの形式は次のようになります。

select . . .
from t1 left join
     t2
     on t1.t1id = t2.t1id left join
     t3
     on t1.t1id = t3.t1id;

すべての ID をまとめて結合します。

select . . .
from (select t1id
      from ((select t1id from t1) union
            (select t1id from t2) union
            (select t1id from t3)
           ) driver left join
           t1
           on t1.t1id = driver.t1id left join
           t2
           on t2.t1id = driver.t1id left join
           t3
           on t3.t1id = driver.t1id;
     )

これdriverは、他のテーブルから必要なすべての「t1」ID で構成されます。一部のテーブルは他の ID で結合している可能性があるため、すべてのテーブルが含まれているとは限りません。

また、unionサブクエリのdriverは意図的なものです。重複を削除したい。

于 2013-08-03T20:57:58.037 に答える