Heim Datenbank MySQL-Tutorial 如何高效能拆分一个字段为多行

如何高效能拆分一个字段为多行

Jun 07, 2016 pm 02:53 PM
eins 如何 字段 拆分 高效能

如何高效能拆分一个字段为多行 我本意是将表中的一个字段拆分成多行,例如aaa,bbb拆分为 aaa bbb 现在测试如下: [sql] with t1 as ( select 3 c1,eee,fff,ggg c2 from dual UNION ALL select 2 c1,ccc,ddd c2 from dual UNION ALL SELECT 1 c1,aaa,bbb c2 F


如何高效能拆分一个字段为多行

 

我本意是将表中的一个字段拆分成多行,例如'aaa,bbb'拆分为

'aaa'

'bbb'

现在测试如下:

 

[sql] 

with t1 as   

(  

     select 3 c1,'eee,fff,ggg' c2 from dual UNION ALL   

     select 2 c1,'ccc,ddd' c2 from dual UNION ALL   

     SELECT 1 c1,'aaa,bbb' c2 FROM dual  

)  

  

select c1,LEVEL,replace(regexp_substr(c2,'[^,]+',1,level),',',' ') c2  

from t1   

connect BY level

order by c1,level  

  www.2cto.com  

返回结果如下:

[sql] 

C1 LEVEL C2  

1 1 aaa  

1 2 bbb  

1 2 bbb  

1 2 bbb  

2 1 ccc  

2 2 ddd  

2 2 ddd  

2 2 ddd  

3 1 eee  

3 2 fff  

3 2 fff  

3 2 fff  

3 3 ggg  

3 3 ggg  

3 3 ggg  

3 3 ggg  

3 3 ggg  

3 3 ggg  

3 3 ggg  

3 3 ggg  

3 3 ggg  

  www.2cto.com  

--======================================================

看起来connect by之后产生了大量重复数据,于是加入distinct后取得正确数据。

反思:

我构造的测试数据仅仅只有三行,最长的拆分资料仅3段'eee,fff,ggg',却产生了21笔资料。如果测试数据增多,或者需拆分的段

数量增多,那么connect by产生的数据将是海量的。

用此种方法实际处理生产库数据时,问题马上显现出来,仅17笔资料,最长拆分字段为8段,竟然产生了738万笔资料,尽管我使用

了distinct,依然慢的很。

 

解决方案:用Join方式取代connect by方式

 

[sql] 

with t1 as   

(  

     select 3 c1,'eee,fff,ggg' c2 from dual UNION ALL   

     select 2 c1,'ccc,ddd' c2 from dual UNION ALL   

     SELECT 1 c1,'aaa,bbb' c2 FROM dual  

)  

  

SELECT c1,  

       substr(t.ca,  

              instr(t.ca, ',', 1, d.lv) + 1,  

              instr(t.ca, ',', 1, d.lv + 1) -  

              (instr(t.ca, ',', 1, d.lv) + 1)) AS d  

  FROM (SELECT c1,  

               ',' || c2 || ',' AS ca,  

               length(c2 || ',') - nvl(length(REPLACE(c2, ',')), 0) AS cnt  

          FROM t1) t,  

       (select rownum lv from  

        (select max(length(c2 || ',') - nvl(length(REPLACE(c2, ',')), 0)) mlc from t1)   

         connect by level

       )d         

WHERE d.lv

ORDER BY c1  

  www.2cto.com  

结论:

对于表资料只有一笔的时候,用connect by一般不会有什么问题。但如果表中资料是多笔,则connect by会产生海量的重复资料。

 

用join方式可解决此类问题。

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße Artikel -Tags

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Schneller Einstieg: Techniken zum Zusammenführen und Aufteilen von JSON-Arrays in Java. Schneller Einstieg: Techniken zum Zusammenführen und Aufteilen von JSON-Arrays in Java. Sep 06, 2023 am 10:21 AM

Schneller Einstieg: Techniken zum Zusammenführen und Aufteilen von JSON-Arrays in Java.

Wie verwende ich PHP ZipArchive, um mehrere komprimierte Pakete zusammenzuführen und aufzuteilen? Wie verwende ich PHP ZipArchive, um mehrere komprimierte Pakete zusammenzuführen und aufzuteilen? Jul 21, 2023 am 10:17 AM

Wie verwende ich PHP ZipArchive, um mehrere komprimierte Pakete zusammenzuführen und aufzuteilen?

Wie kann man in PHP feststellen, ob ein Feld leer ist? Wie kann man in PHP feststellen, ob ein Feld leer ist? Mar 20, 2024 pm 03:09 PM

Wie kann man in PHP feststellen, ob ein Feld leer ist?

Gibt es eine Zukunft für eine Beschäftigung in der klinischen Pharmazie an der Harbin Medical University? (Wie sind die Beschäftigungsaussichten für die klinische Pharmazie an der Harbin Medical University?) Gibt es eine Zukunft für eine Beschäftigung in der klinischen Pharmazie an der Harbin Medical University? (Wie sind die Beschäftigungsaussichten für die klinische Pharmazie an der Harbin Medical University?) Jan 02, 2024 pm 08:54 PM

Gibt es eine Zukunft für eine Beschäftigung in der klinischen Pharmazie an der Harbin Medical University? (Wie sind die Beschäftigungsaussichten für die klinische Pharmazie an der Harbin Medical University?)

NoSuchFieldError in Java – Lösung für Feld nicht gefunden NoSuchFieldError in Java – Lösung für Feld nicht gefunden Jun 25, 2023 am 11:33 AM

NoSuchFieldError in Java – Lösung für Feld nicht gefunden

Was bedeutet MySQL-Feld? Was bedeutet MySQL-Feld? Jul 10, 2023 pm 02:14 PM

Was bedeutet MySQL-Feld?

So fügen Sie Felder zur Datenbanktabelle hinzu So fügen Sie Felder zur Datenbanktabelle hinzu Mar 18, 2021 pm 02:13 PM

So fügen Sie Felder zur Datenbanktabelle hinzu

So setzen Sie das Win10-System zurück So setzen Sie das Win10-System zurück Jun 29, 2023 pm 03:14 PM

So setzen Sie das Win10-System zurück

See all articles