2016-12-06 5 views
-1

私は3つのテーブルa、b、cを持っていると言います。 Aはcに関連するbに関する。私は、すべてのレコードをcから取り出し、aからのすべてのレコードに関連付ける必要があります。特定のレコードを引き出すサブクエリ

表A 2つのレコードを有し、cが3つのレコードを持っており、以下が真である場合:

  • C1は、A1およびA2
  • C2に関する
  • C3がA1とA2
  • に関するA1にも関します

クエリは、c1とc3を返します。

私はちょうど何かの理由でそれのまわりで私の心を得ることができません。

SELECT c.value 
FROM c 
INNER JOIN b 
    ON c.b_id = b.b_id 
INNER JOIN a 
    ON b.a_id = a.a_id 
WHERE c.value IN (???) 
+0

ようこそ。サンプル表データを表形式で表示し、期待される出力を[mcve]に表示してください。あなたはより良い結果を得るでしょう。 – OldProgrammer

+0

私はより良い例を挙げたいと思いますが、もう一度、私は問題を抱えて頭を悩ませています。私は将来もっとうまくいくでしょう。アドバイスありがとう。 – ToastGhost

+0

BはAとCにどのような関係がありますか?サンプルデータと期待される結果を教えてください。 – Fritz

答えて

0

あなたの質問とサンプルコードには、混乱しているさまざまな関係の方向性があります。私の経験では、Oracleオプティマイザがこれを行うには良い仕事をすることになってい

SELECT value FROM (
    SELECT c.value, COUNT(DISTINCT a.a_id) a_qty FROM c 
    INNER JOIN b ON c.b_id = b.b_id 
    INNER JOIN a ON b.a_id = a.a_id 
    GROUP BY c.value 
) WHERE a_qty = (SELECT COUNT(*) FROM a) 
0

:正しい関係の方向のための指標として、あなたのコードを受け入れるとのをカウントすることによって、それを修正することは、あなたに可能ではなく、非常にエレガントなソリューションを提供します効率的に実行します。特に一致する列がインデックスされている場合は、

SELECT * 
    FROM c 
WHERE EXISTS 
      (SELECT NULL 
       FROM a 
        INNER JOIN b 
         ON (a.abmatch = b.abmatch) 
         AND b.cbmatch = c.cbmatch); 
関連する問題