4

2つの異なるテーブルの4つの異なる列を、重複を削除して、考えられるすべての結果の1つの列にマージする方法がわかりません。実際の名前は異なりますが、次の2つのテーブルがあるとします。

表1

  1. フィールド1
  2. フィールド2
  3. SomethingElse

表2

  1. フィールド1
  2. フィールド2
  3. SomethingElse

最後に、これら4つのフィールドすべてを1つの大きなフィールドにマージし、その上にdistinctを使用して、重複を排除します。これらのフィールドは多数あるためです。最終的な結果は、重複することなく、4つの列すべてで見つかったすべての可能な値を含む1つの列になります。

2つのフィールドを持つ1つのテーブルだけで作業していたときは、正常に機能していました。

select distinct(Field1) from Table1 where SomethingElse = SomeVal
union
(select distinct(Field2) from Table1 where SomethingElse = SomeVal)
order by 1

distinct(もちろん、各フィールドではなく、最終結果を実行したかったのです)

次に、別のテーブルからさらに2つのフィールドを追加する必要がありました。私が試したことは何も実行されておらず、構文を正しく理解できません。

4

2 に答える 2

7

これが1つの方法です:

select distinct val
from ((select field1 as val from table1 where somethingelse = someval) union all
      (select field2 from table1 where somethingelse = someval) union all
      (select field1 from table2 where somethingelse = someval) union all
      (select field2 from table2 where somethingelse = someval)
     ) t

を使用してサブクエリを結合し、外側のレベルで1回union allだけ実行します。distinct

次に知りたいのは、これらの値がどこで使用されているかということなので、そのためのクエリは次のとおりです。

select val, SUM(t1f1), SUM(t1f2), SUM(t2f1), SUM(t2f2)
from ((select field1 as val, 1 as t1f1, 0 as t1f2, 0 as t2f1, 0 as t2f2 from table1 where somethingelse = someval) union all
      (select field2, 0 as t1f1, 1 as t1f2, 0 as t2f1, 0 as t2f2 from table1 where somethingelse = someval) union all
      (select field1, 0 as t1f1, 0 as t1f2, 1 as t2f1, 0 as t2f2 from table2 where somethingelse = someval) union all
      (select field2, 0 as t1f1, 0 as t1f2, 0 as t2f1, 1 as t2f2 from table2 where somethingelse = someval)
     ) t
group by val
于 2012-12-26T18:52:51.903 に答える
1
select distinct(Field1) from 
(
select Field1 [Field1] from Table1 where SomethingElse = SomeVal
union all
select Field2 [Field1] from Table1 where SomethingElse = SomeVal
) rawResults
order by 1

そのようなものが機能するはずです。選択したものを結合してインラインビューに配置し、外側に明確な順序を配置するだけです。とにかく外側で一度はっきりと区別するつもりなので、私はすべてユニオンを使用しました

于 2012-12-26T18:57:07.257 に答える