2011-07-22 16 views
2

1つの要求で1つのテーブル内の複数のフィールドから個別の値を取得する方法を教えてください。1つのテーブル内の複数のフィールドからの異なる値ORACLE SQL

オプション1

SELECT WM_CONCAT(DISTINCT(FIELD1)) FIELD1S,WM_CONCAT(DISTINCT(FIELD2)) FIELD2S,..FIELD10S 
    FROM TABLE; 

WM_CONCATはあなたが異なる値Fを取得すると2

select DISTINCT(FIELD1) FIELDVALUE, 'FIELD1' FIELDNAME 
     FROM TABLE 
UNION 
select DISTINCT(FIELD2) FIELDVALUE, 'FIELD2' FIELDNAME 
     FROM TABLE 
... FIELD 10 

オプションが

+0

ですから、単一のレコードに選択クエリの出力を連結しようとしている、あなたではありませんか?このようなもの? http://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:229614022562 – Aitor

+0

「遅すぎます」という速度はどれくらいですか?私たちは何冊のレコードを話していますか?総レコード数のうち、いくつの異なる値がありますか? – APC

+0

@APCオプション2は約80秒で、108443レコードになります。 – Rodriguez

答えて

0

あまりにも遅いです限られています複数の列を使用すると、データテーブルは返されません。あなたが次のデータを考えると

 
Column A   Column B
10 50
30 50
10 50

が得られるときは、最初の列から2行、2列目から1行になります。それは単に動作しません。

0

これは何ですか?

select FIELD1 FROM TABLE 
UNION 
select FIELD2 FROM TABLE 

UNION 2つのテーブルからのユニークなセットを提供しますので、:あなたはdistinctキーワードを取り出すことにより、いくつかのパフォーマンスを保存することができかもしれませんが

SELECT 'FIELD1',FIELD1, 'FIELD2',FIELD2,... 
FROM TABLE 
GROUP BY FIELD1,FIELD2,... 
+0

これはちょうどユニークな組み合わせを与える – Rodriguez

1

SQLでの最良のオプションは、UNIONですこの場合、distinctは冗長です。このクエリを別の方法で作成してより高速に実行する方法はありません。 200,000以上の行の検索を高速化する魔法の式はありません。テーブルのすべての行を2回検索して一意性をソートする必要があります。これはまさにUNIONが行うことです。

これを高速化できる唯一の方法は、2つのフィールドに別々のインデックスを作成するか(多分)、検索しているデータのセットを減らすことです。

また、これを多く実行して新しいフィールドを追加することはめったにない場合は、マテリアライズド・ビューを使用して結果を格納し、定期的にリフレッシュする必要があります。

ちなみに、2番目のクエリは、あなたが望むようには表示されません。 Distinctは常にselectセクションのすべての列に適用されるため、フィールド名を含む定数により、クエリは常に2つの列の個別の行を返します。


私は実験的に少し速いと思われる別の方法を考え出しました。これにより、デカルト結合のためのフルテーブルスキャンを1つ取引することができます。ほとんどの場合、クエリが何をしているかがはっきりしているので、私はまだunionを使用することを選択します。

SELECT DISTINCT CASE lvl WHEN 1 THEN field1 ELSE field2 END 
FROM    table 
     CROSS JOIN (SELECT  LEVEL lvl 
        FROM  DUAL 
        CONNECT BY LEVEL <= 2); 

それは私800,000行を含む便利なインデックスせずにテーブルの上に両方のクエリをテストし、それが(145,000行を返す)大体45秒かかったことを追加することも価値があります。しかし、その時間の大部分は、実際にレコードをフェッチするために費やされたもので、クエリを実行していませんでした(クエリには3〜7秒かかりました)。大量の行が戻ってきた場合は、表示されているパフォーマンスの問題の原因となっている行の数にすぎないことがあります。

1

あなたがあなたのクエリ などを最適化するためにWITHを使用することができます(テーブル全体をスキャンし、フルではない)データの小さな範囲をスキャンした場合:

WITH a AS 
(SELECT field1,field2,field3..... FROM TABLE WHERE condition) 
SELECT field1 FROM a 
UNION 
SELECT field2 FROM a 
UNION 
SELECT field3 FROM a 
.....etc 
2

私の問題については、私は

WL1 ... WL2 ... correlation 
A   B    0.8 
B   A    0.8 
A   C    0.9 
C   A    0.9 
を持っていました

このテーブルから対称性を取り除く方法はありますか?

select WL1, WL2,correlation from 
    table 
    where least(WL1,WL2)||greatest(WL1,WL2) = WL1||WL2 
    order by WL1 

これは

WL1 ... WL2 ... correlation 
A   B    0.8 
A   C    0.9 

を与える:)

関連する問題