2011-07-22 41 views
2

如何在只有一個請求的情況下從一個表內的多個字段獲取不同的值。一個表內多個字段的不同值ORACLE SQL

選項1個

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

WM_CONCAT有限

選項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

當你得到不同的數值F從多個列開始,它不會返回數據表。如果您認爲以下數據爲

 
Column A   Column B
10 50
30 50
10 50

當您得到不同的數據時,它將是第一列的2行和第二列的1行。它根本無法工作。

0

像這樣的東西?

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

這將給出唯一的組合 – Rodriguez

1

在SQL最好的選擇是UNION,雖然你可以通過取出distinct關鍵字來節省一些性能:

select FIELD1 FROM TABLE 
UNION 
select FIELD2 FROM TABLE 

UNION提供了從兩個表中的一套獨特的,所以在這種情況下,明顯是多餘的。根本沒有辦法以不同的方式編寫這個查詢,以使其執行速度更快。沒有什麼神奇的公式可以更快地搜索200,000多行。它需要搜索表格的每一行兩次,並按照唯一性排序,這正是UNION所要做的。

使其更快的唯一方法是在兩個字段(可能)上創建單獨的索引,或者減少要搜索的數據集。

或者,如果您要做的很多,並且很少添加新字段,則可以使用實例化視圖來存儲結果並僅定期刷新它。

順便說一句,您的第二個查詢似乎沒有做你想做的。 Distinct總是適用於select部分中的所有列,因此具有字段名稱的常量將導致查詢始終爲兩列返回單獨的行。


我想出了另一種方法,在實驗上,似乎有點快。在情況中,這允許我們交易一個全表掃描以進行笛卡爾連接。在大多數情況下,我仍然會選擇使用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行有用的索引,並花了大約45秒(返回145000行)。但是,大部分時間都花費在實際獲取記錄上,而不是運行查詢(查詢耗時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 

:)

相關問題