0

結合されたサブクエリを含むクエリがあります。サブクエリが null を返す場合、それを無視して、残りのクエリを正常に動作させたいと考えています。

現在、私は次のようなものを持っています:

SELECT a, b, c, d
FROM tblOne
JOIN tblTwo ON tblOne.a = tblTwo.a --this works fine
JOIN
    (SELECT a
    FROM tblThree) ON tblThree.a = tblOne.a

問題は、tblThree.a が null の場合、クエリ全体が null を返すことです。したがって、tblThree.a が null でない場合にのみサブクエリを使用したいと考えています。

CASEや COALESCE、またはその他の方法で何かを行うことはできますか? コード例を教えてください。

4

4 に答える 4

5

LEFT OUTER JOINの代わりに を使用しINNER JOINます。tblThreeこれにより、一致する行が返されない場合でも、残りのクエリのすべての行が返されます。この場合、 の列tblThreeはすべて になりますNULL

クエリを使用して (ただし、派生テーブルに必要なエイリアスを追加しました):

SELECT a, b, c, d
FROM tblOne
INNER JOIN tblTwo ON tblOne.a = tblTwo.a
LEFT OUTER JOIN
(
    SELECT a, e, f
    FROM tblThree
) tblThree ON tblThree.a = tblOne.a

@491243 が指摘しているように、ここでの派生テーブル サブクエリは実際には意味をなさないことに注意してください。aまた、SELECT 句にあいまいな列が含まれている可能性があります。ただし、これは実際のクエリの外挿にすぎないと思います。

于 2013-09-19T15:59:34.583 に答える
1

3 番目の結合を LEFT JOIN に変更してみてください。

LEFT JOIN
    (SELECT a, e, f
    FROM tblThree) ON tblThree.a = tblOne.a

次に、 a が null の場合でも、結合が試行される前の元の行が取得されます。別のオプションは、追加することです

WHERE a IS NOT NULL 

サブクエリに追加して、 a に値がある行のみを返します。

于 2013-09-19T16:01:16.923 に答える
0

「tblThree.aがnullの場合、クエリ全体がnullを返す」という意味がわかりません。のNULL値はa、すべての結果ではなく、1 つの行に影響します。それ以外の場合、一致する行は引き続き一致します。

ただし、以下はあなたが望むことをするかもしれません:

select a, b, c, d
from (SELECT a, b, c, d, count(tblThree.a) over () as nummatches, tblthree.a as t3a
      FROM tblOne JOIN
           tblTwo
           ON tblOne.a = tblTwo.a LEFT OUTER JOIN
           (SELECT a, e, f
            FROM tblThree
           ) tblThree
           ON tblThree.a = tblOne.a
    ) t
where nummatches = 0 or nummatches > 0 and t3a is not null;

このクエリは、 の有効なa値の数をカウントしますtblThree。何もない場合はすべてが返され、そうでない場合は一致するものだけが返されます。ところで、列名でテーブル エイリアスを使用する場合、テーブルのサブクエリは必要ありません。

于 2013-09-19T16:03:42.760 に答える
0

EXISTS を使用してみてください。

SELECT a, b, c, d
FROM tblOne, tblTwo
WHERE EXISTS(
SELECT a from tblThree
WHERE tblThree.a=tblOne.a) AND tblOne.a = tblTwo.a;

これを自分で確認してください..しかし、あなたはそれを手に入れましたよね?

于 2013-09-19T17:42:20.830 に答える