1

現在、3 つのフィールドに参加している 2 つのテーブルがあります。

SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
 WHERE t1.A = t2.A
   AND t1.B = t2.B
   AND t1.C = t2.C

私のデータの仕組みにより、結合が A/B/C で一致しない場合は、A/B で結合したいと考えています。その結合が一致しない場合は、A で結合したいだけです。このタイプのカスケード結合は、SQL クエリ内で可能ですか (私は Oracle 10g を使用しています)? または、これをコードで処理する必要がありますか?

4

3 に答える 3

2

これはうまくいきますか?

  SELECT DISTINCT 
         t1.A,
         t1.B,
         t1.C,
         t2.D
    FROM t1, t2
   WHERE (t1.A = t2.A
          AND t1.B = t2.B
          AND t1.C = t2.C)
      OR (t1.A = t2.A
          AND t1.B = t2.B)
      OR (t1.A = t2.A);

編集:

すべての結果が必要であるが、それらがどのように一致したかを確認したい場合は、次を発行できます。

   SELECT t1.A,
          t1.B,
          t1.C,
          t2.D,
          (CASE 
              WHEN t1.A = t2.A
               AND t1.B = t2.B
               AND t1.C = t2.C
              THEN 'A/B/C'
              WHEN t1.A = t2.A
               AND t1.B = t2.B
              THEN 'A/B'
              WHEN t1.A = t2.A
              THEN 'A'
              ELSE 'None'
           END) AS match_criteria
     FROM t1, t2
    WHERE t1.A = t2.A; 

結果セットでは、行の一致レベルを確認し、そこからデータを使用できます。おそらく、このクエリを外側のクエリでラップすることで、不要な行を破棄するか、必要な行に優先順位を付けることができます。

それが役に立てば幸い...

于 2012-04-17T14:57:41.750 に答える
2

これを行うには、3 つのクエリを一緒に UNION し、2 つのより一般的なクエリでは、より具体的なクエリで返された行を除外します。

より一般的なクエリから除外する行を決定する方法は、データの形状によって異なりますが、次のような方法を試すことができます。

SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
 WHERE t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C
UNION 
SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
 WHERE t1.A = t2.A AND t1.B = t2.B 
  AND NOT EXISTS (SELECT * FROM t2 WHERE t2.A = t1.A AND t2.B = t1.B AND t2.C = t1.C)
UNION
SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
 WHERE t1.A = t2.A
  AND NOT EXISTS (SELECT * FROM t2 WHERE t2.A = t1.A AND t2.B = t1.B)
于 2012-04-17T15:11:24.417 に答える
0
SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1
  LEFT JOIN t2
  ON t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C

Try this and check if you like the results, if not, use this (psedo.code):

insert into #temptable
SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
  WHERE t1.A = t2.A AND t1.B = t2.B AND t1.C = t2.C

IF select count(*) from #temptable = 0 then
insert into #temptable
SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
  WHERE t1.A = t2.A AND t1.B = t2.B
end if;


IF select count(*) from #temptable = 0 then
insert into #temptable
SELECT t1.A, t1.B, t1.C, t2.D
  FROM t1, t2
  WHERE t1.A = t2.A
end if;

select * from #temptable
drop #temptable
于 2012-04-17T14:29:00.513 に答える