2016-11-01 36 views
1

我試圖創建零件的不同列表做分析在表中。該表格包含一列零件ID和一列標識符。標識符通過管道在相同條目內分開,但不幸的是標識符出現故障。我不確定這是否可能,但任何幫助將不勝感激!的Oracle SQL合併多行用相同的ID訂單標識符的了,但

例如(目前這兩個ID和標識符是VARCHAR2)

ID Identifiers 
1 |1|2| 
1 |2|1| 
2 |3|A|1|B| 
2 |B|1|3|A| 
3 |1|3|2| 
3 |1|5| 
3 |2|1|3| 
4 |AA|BB|1|3A| 
4 |1|3A|AA|BB| 

,我需要查詢返回

ID Identifiers 
1 |1|2| 
2 |3|A|1|B| 
3 |1|5| 
3 |1|3|2| 
4 |1|AA|BB|3A| 

不要緊,有什麼具體的順序標識符中,只要訂購因爲該標識符內的所有內容都是相同的。例如,| 1 | 5 |或| 5 | 1 |並不重要,但我需要看到兩個條目| 1 | 5 |和| 1 | 3 | 2。我最初的想法是創建單獨的列標識符,然後按字母順序連接成一列,但我不知道...先謝謝了!

+0

你關心,如果該查詢不匹配任何原始行的順序返回標識?例如按字母順序排列(數字在哪裏都可能)? – mathguy

+0

不可以按任何順序退貨! – mlin

+0

而且,單行中的標識符之間是否可以有重複?如果是這樣,你是否需要重複重複正確的次數,或者你可以鞏固它們? – mathguy

回答

1

像這樣(假設有在輸入表中沒有重複行 - 如果存在,則溶液需要修改一個位)。

在我建立用於測試的TEST_TABLE(它不是解決方案的一部分),並且我建立另一個因式分解子查詢中WITH子句的溶液。這適用於Oracle 11及更高版本。對於早期版本的Oracle,定義爲prep子查詢需要被移動,而不是最終的查詢中的子查詢。

with 
    test_table (id, identifiers) as (
     select '1', '|1|2|'  from dual union all 
     select '1', '|2|1|'  from dual union all 
     select '2', '|3|A|1|B|' from dual union all 
     select '2', '|B|1|3|A|' from dual union all 
     select '3', '|1|3|2|'  from dual union all 
     select '3', '|1|5|'  from dual union all 
     select '3', '|2|1|3|'  from dual union all 
     select '4', '|AA|BB|1|3A|' from dual union all 
     select '4', '|1|3A|AA|BB|' from dual 
    ), 
    prep (id, identifiers, token) as (
     select id, identifiers, regexp_substr(identifiers, '[^|]+', 1, level) 
     from test_table 
     connect by level <= regexp_count(identifiers, '\|') - 1 
      and prior identifiers = identifiers 
      and prior sys_guid() is not null 
    ) 
select distinct id, 
     '|' || listagg(token, '|') within group (order by token) || '|' 
               as identifiers 
from prep 
group by id, identifiers 
order by id, identifiers -- ORDER BY is optional 
; 

輸出

ID IDENTIFIERS 
--- -------------------- 
1 |1|2| 
2 |1|3|A|B| 
3 |1|2|3| 
3 |1|5| 
4 |1|3A|AA|BB| 

5 rows selected. 
+0

謝謝你看這個!有什麼方法可以讓查詢花費更少的時間來運行或估計它應該運行多長時間?我正在處理的表格大約有900k行,查詢提供的時間比我之前的任何查詢都長(現在持續了大約45分鐘)。謝謝! – mlin

+0

它不僅取決於行數,還取決於每行中有多少個標識符。但預計需要很長時間,這些操作相當耗時。這是違反「第一範式」的數據支付的非常高的成本 - 首先它不應該是這種形式。有了這個說法 - 你是否首先在一個較小的案例上運行它,用2k行而不是900k?想知道期望什麼? – mathguy

相關問題