3

AA、BB、CC の 3 つのテーブルがあります。BB と CC には、テーブル AA への 1 対 1 のマッピングがあります (両方のテーブルで外部キー列: aa_id を使用)。BB または CC のいずれかのみがテーブル AA の行を参照できるという 1 つの条件が提供されます。

BBまたはCCと結合するAAから最新の1000行を選択したいと思います。BB と CC に結合する 500 行を個別に選択して 1000 を作成するクエリを個別に実行できます。ただし、これは AA テーブルから最新の 1000 行を取得することを保証するものではありません。

そこで、BB と CC を同時に結合して AA からレコードを選択する次のクエリを思いつきました。しかし、私の制限(BB または CC のみがテーブル AA の行を参照できる) により、以下のクエリから 0 行を取得しています。

SELECT  * FROM AA 
       INNER JOIN BB  ON (
            AA.id = BB.aa_id
            AND SOME_CONDITION
        ) 
        INNER JOIN CC  ON (
            AA.id = CC.aa_id
            AND SOME_CONDITION
        )
ORDER BY
AA.id DESC limit 1000;

これを行う方法を教えてください。これら 2 つの JOIN 条件を OR できる方法はありますか?

4

5 に答える 5

1

BB または CC に対応するレコードが存在する AA にすべてのレコードが必要な場合は、結合する必要さえありません (BB と CC の値は必要ないと仮定します)。EXISTS代わりに使用してください:

SELECT *  FROM AA
    WHERE
    (
        EXISTS (
            SELECT 1 FROM BB WHERE AA.id = BB.aa_id
                /* AND SOME_CONDITION */
        ) OR EXISTS (
            SELECT 1 FROM CC WHERE AA.id = CC.aa_id
                /* AND SOME_CONDITION */)
    )
    ORDER BY AA.id DESC limit 1000;

私には、それはよりきれいに見えます (また、処理されるデータが少ないため、少し高速になる可能性もありますが、テストしていません)!

于 2012-08-21T09:27:30.193 に答える
1

BBまたはCCの各行には1 つの一致しかないため、を にAA置き換える必要があります。INNER JOINLEFT OUTER JOIN

したがって、クエリは次のようになります。

SELECT * FROM AA 
    LEFT OUTER JOIN BB ON (
        AA.id = BB.aa_id
        AND SOME_CONDITION
    ) 
    LEFT OUTER JOIN CC ON (
        AA.id = CC.aa_id
        AND SOME_CONDITION
    )
ORDER BY
AA.id DESC limit 1000;
于 2012-08-21T09:10:55.253 に答える
0

編集:「AAの最後の1000行」と言ったので、選択でAA.*を指定するように注意してください。そうしないと、AAで構成される1000行が得られ、BBのすべてのフィールドとCCのすべてのフィールド(の1つ) 2 つのセットも NULL になります)。

これは、BB または CC (または両方) のいずれかに一致する AA の最後の 1000 行を取得します。

SELECT  AA.* FROM AA
   LEFT JOIN BB  ON (
        AA.id = BB.aa_id
        AND SOME_CONDITION
    ) 
    LEFT JOIN CC  ON (
        AA.id = CC.aa_id
        AND SOME_CONDITION
    )
    WHERE (BB.aa_id IS NOT NULL OR CC.aa_id IS NOT NULL)
ORDER BY AA.id DESC LIMIT 1000;
于 2012-08-21T09:24:07.567 に答える
0

@oezi は絶対に正しいです。クエリに必要な変更はほとんどありません。削除するだけINNER JOINです。@oeze が述べた条件で使用LEFT OUTER JOINします。AND

于 2012-08-21T09:42:51.560 に答える