17,082
社区成员
发帖
与我相关
我的任务
分享
SELECT CARRIERID, FLTNO, FLTDATE, IO, NEW_APT_T1, NEW_APT_T2
FROM (SELECT T1.CARRIERID,
T1.FLTNO,
T1.FLTDATE,
T1.IO,
NEW_APT_T1,
NEW_APT_T2,
ROW_NUMBER() OVER(PARTITION BY T1.CARRIERID, T1.FLTNO, T1.FLTDATE, T1.IO, ASCII(NEW_APT_T1) + ASCII(NEW_APT_T2) ORDER BY NEW_APT_T1, NEW_APT_T2) RN
FROM (SELECT TT.*,
SUBSTR(',' || TRIM(',' FROM APT) || ',',
INSTR(',' || TRIM(',' FROM APT) || ',',
',',
1,
RN) + 1,
INSTR(',' || TRIM(',' FROM APT) || ',',
',',
1,
RN + 1) - INSTR(',' || TRIM(',' FROM APT) || ',',
',',
1,
RN) - 1) NEW_APT_T1
FROM T_FltInfo TT,
(SELECT ROWNUM RN
FROM ALL_OBJECTS
WHERE ROWNUM <= (SELECT MAX(LENGTH(TRIM(',' FROM APT)) -
LENGTH(REPLACE(TRIM(',' FROM APT),
',',
'')))
FROM T_FltInfo TT) + 1) ZZ
WHERE INSTR(',' || TRIM(',' FROM APT) || ',', ',', 1, RN) > 0) T1,
(SELECT TT.*,
SUBSTR(',' || TRIM(',' FROM APT) || ',',
INSTR(',' || TRIM(',' FROM APT) || ',',
',',
1,
RN) + 1,
INSTR(',' || TRIM(',' FROM APT) || ',',
',',
1,
RN + 1) - INSTR(',' || TRIM(',' FROM APT) || ',',
',',
1,
RN) - 1) NEW_APT_T2
FROM T_FltInfo TT,
(SELECT ROWNUM RN
FROM ALL_OBJECTS
WHERE ROWNUM <= (SELECT MAX(LENGTH(TRIM(',' FROM APT)) -
LENGTH(REPLACE(TRIM(',' FROM APT),
',',
'')))
FROM T_FltInfo TT) + 1) ZZ
WHERE INSTR(',' || TRIM(',' FROM APT) || ',', ',', 1, RN) > 0) T2
WHERE T1.CARRIERID = T2.CARRIERID
AND T1.FLTNO = T2.FLTNO
AND T1.FLTDATE = T2.FLTDATE
AND T1.IO = T2.IO
AND NEW_APT_T1 <> NEW_APT_T2) YY
WHERE ASCII(NEW_APT_T1) < ASCII(NEW_APT_T2)
order by NEW_APT_T1, NEW_APT_T2;
--运行结果:
CARRIERID FLTNO FLTDATE IO NEW_APT_T1 NEW_APT_T2
1 CZ 123 2008-12-31 I AAA BBB
2 CZ 123 2008-12-31 I AAA CCC
3 CZ 123 2008-12-31 I AAA DDD
4 CZ 123 2008-12-31 I AAA EEE
5 CZ 123 2008-12-31 I BBB CCC
6 CZ 123 2008-12-31 I BBB DDD
7 CZ 123 2008-12-31 I BBB EEE
8 CZ 123 2008-12-31 I CCC DDD
9 CZ 123 2008-12-31 I CCC EEE
10 CZ 123 2008-12-31 I DDD EEE
SQL> with tp_sql as
2 (select b.rid,
3 replace(substr('OAK,ANC,NRT,PEK,',
4 decode(b.rid,
5 1,
6 1,
7 instr('OAK,ANC,NRT,PEK,',
8 ',',
9 1,
10 b.rid - 1)),
11 instr('OAK,ANC,NRT,PEK,', ',', 1, b.rid) -
12 decode(b.rid,
13 1,
14 1,
15 instr('OAK,ANC,NRT,PEK,',
16 ',',
17 1,
18 b.rid - 1))),
19 ',',
20 '') name
21 from dual a,
22 (select rownum rid
23 from all_objects
24 where rownum <=
25 (select length('OAK,ANC,NRT,PEK,') -
26 length(replace('OAK,ANC,NRT,PEK,', ',', ''))
27 from dual)) b)
28 select a.name, b.name
29 from tp_sql a,
30 tp_sql b
31 where b.rid > a.rid;
NAME NAME
---------- ----------
OAK ANC
OAK NRT
ANC NRT
OAK PEK
ANC PEK
NRT PEK
已选择6行。
SQL> /
NAME NAME
---------- ----------
OAK ANC
OAK NRT
ANC NRT
OAK PEK
ANC PEK
NRT PEK
已选择6行。
SQL> with tp_sql as
2 (select b.rid,
3 replace(substr('AAA,BBB,CCC,DDD,EEE,',
4 decode(b.rid,
5 1,
6 1,
7 instr('AAA,BBB,CCC,DDD,EEE,',
8 ',',
9 1,
10 b.rid - 1)),
11 instr('AAA,BBB,CCC,DDD,EEE,', ',', 1, b.rid)
-
12 decode(b.rid,
13 1,
14 1,
15 instr('AAA,BBB,CCC,DDD,EEE,',
16 ',',
17 1,
18 b.rid - 1))),
19 ',',
20 '') name
21 from dual a,
22 (select rownum rid
23 from all_objects
24 where rownum <=
25 (select length('AAA,BBB,CCC,DDD,EEE,') -
26 length(replace('AAA,BBB,CCC,DDD,EEE,', ',',
''))
27 from dual)) b)
28 select a.name, b.name
29 from tp_sql a,
30 tp_sql b
31 where b.rid > a.rid;
NAME NAME
---------- ----------
AAA BBB
AAA CCC
BBB CCC
AAA DDD
BBB DDD
CCC DDD
AAA EEE
BBB EEE
CCC EEE
DDD EEE
SELECT CARRIERID, FLTNO, FLTDATE, IO, NEW_APT_T1, NEW_APT_T2
FROM (SELECT T1.CARRIERID,
T1.FLTNO,
T1.FLTDATE,
T1.IO,
NEW_APT_T1,
NEW_APT_T2,
ROW_NUMBER() OVER(PARTITION BY T1.CARRIERID, T1.FLTNO, T1.FLTDATE, T1.IO, ASCII(NEW_APT_T1) + ASCII(NEW_APT_T2) ORDER BY NEW_APT_T1, NEW_APT_T2) RN
FROM (SELECT TT.*,
SUBSTR(',' || TRIM(',' FROM APT) || ',',
INSTR(',' || TRIM(',' FROM APT) || ',',
',',
1,
RN) + 1,
INSTR(',' || TRIM(',' FROM APT) || ',',
',',
1,
RN + 1) - INSTR(',' || TRIM(',' FROM APT) || ',',
',',
1,
RN) - 1) NEW_APT_T1
FROM T_FltInfo TT,
(SELECT ROWNUM RN
FROM ALL_OBJECTS
WHERE ROWNUM <=
(SELECT MAX(LENGTH(TRIM(',' FROM APT)) -
LENGTH(REPLACE(TRIM(',' FROM APT),
',',
'')))
FROM T_FltInfo TT) + 1) ZZ
WHERE INSTR(',' || TRIM(',' FROM APT) || ',', ',', 1, RN) > 0) T1,
(SELECT TT.*,
SUBSTR(',' || TRIM(',' FROM APT) || ',',
INSTR(',' || TRIM(',' FROM APT) || ',',
',',
1,
RN) + 1,
INSTR(',' || TRIM(',' FROM APT) || ',',
',',
1,
RN + 1) - INSTR(',' || TRIM(',' FROM APT) || ',',
',',
1,
RN) - 1) NEW_APT_T2
FROM T_FltInfo TT,
(SELECT ROWNUM RN
FROM ALL_OBJECTS
WHERE ROWNUM <=
(SELECT MAX(LENGTH(TRIM(',' FROM APT)) -
LENGTH(REPLACE(TRIM(',' FROM APT),
',',
'')))
FROM T_FltInfo TT) + 1) ZZ
WHERE INSTR(',' || TRIM(',' FROM APT) || ',', ',', 1, RN) > 0) T2
WHERE T1.CARRIERID = T2.CARRIERID
AND T1.FLTNO = T2.FLTNO
AND T1.FLTDATE = T2.FLTDATE
AND T1.IO = T2.IO
AND NEW_APT_T1 <> NEW_APT_T2) YY
WHERE RN = 1;
-- TRY IT ..
SQL> SELECT * FROM TABLE_NAME;
CARRIERID FLTNO FLTDATE IO APT
--------- ---------- ----------- -- ----------------
CZ 123 2008-12-31 I OAK,ANC,NRT,PEK,
SQL> SELECT CARRIERID, FLTNO, FLTDATE, IO, NEW_APT_T1, NEW_APT_T2
2 FROM (SELECT T1.CARRIERID,
3 T1.FLTNO,
4 T1.FLTDATE,
5 T1.IO,
6 NEW_APT_T1,
7 NEW_APT_T2,
8 ROW_NUMBER() OVER(PARTITION BY T1.CARRIERID, T1.FLTNO, T1.FLTDATE, T1.IO, ASCII(NEW_APT_T1) + ASCII(NEW_APT_T2) ORDER BY NEW_APT_T1, NEW_APT_T2) RN
9 FROM (SELECT TT.*,
10 SUBSTR(',' || TRIM(',' FROM APT) || ',',
11 INSTR(',' || TRIM(',' FROM APT) || ',',
12 ',',
13 1,
14 RN) + 1,
15 INSTR(',' || TRIM(',' FROM APT) || ',',
16 ',',
17 1,
18 RN + 1) - INSTR(',' || TRIM(',' FROM APT) || ',',
19 ',',
20 1,
21 RN) - 1) NEW_APT_T1
22 FROM TABLE_NAME TT,
23 (SELECT ROWNUM RN
24 FROM ALL_OBJECTS
25 WHERE ROWNUM <=
26 (SELECT MAX(LENGTH(TRIM(',' FROM APT)) -
27 LENGTH(REPLACE(TRIM(',' FROM APT),
28 ',',
29 '')))
30 FROM TABLE_NAME TT) + 1) ZZ
31 WHERE INSTR(',' || TRIM(',' FROM APT) || ',', ',', 1, RN) > 0) T1,
32 (SELECT TT.*,
33 SUBSTR(',' || TRIM(',' FROM APT) || ',',
34 INSTR(',' || TRIM(',' FROM APT) || ',',
35 ',',
36 1,
37 RN) + 1,
38 INSTR(',' || TRIM(',' FROM APT) || ',',
39 ',',
40 1,
41 RN + 1) - INSTR(',' || TRIM(',' FROM APT) || ',',
42 ',',
43 1,
44 RN) - 1) NEW_APT_T2
45 FROM TABLE_NAME TT,
46 (SELECT ROWNUM RN
47 FROM ALL_OBJECTS
48 WHERE ROWNUM <=
49 (SELECT MAX(LENGTH(TRIM(',' FROM APT)) -
50 LENGTH(REPLACE(TRIM(',' FROM APT),
51 ',',
52 '')))
53 FROM TABLE_NAME TT) + 1) ZZ
54 WHERE INSTR(',' || TRIM(',' FROM APT) || ',', ',', 1, RN) > 0) T2
55 WHERE T1.CARRIERID = T2.CARRIERID
56 AND T1.FLTNO = T2.FLTNO
57 AND T1.FLTDATE = T2.FLTDATE
58 AND T1.IO = T2.IO
59 AND NEW_APT_T1 <> NEW_APT_T2) YY
60 WHERE RN = 1;
CARRIERID FLTNO FLTDATE IO NEW_APT_T1 NEW_APT_T2
--------- ---------- ----------- -- ----------------- -----------------
CZ 123 2008-12-31 I ANC NRT
CZ 123 2008-12-31 I ANC OAK
CZ 123 2008-12-31 I ANC PEK
CZ 123 2008-12-31 I NRT OAK
CZ 123 2008-12-31 I NRT PEK
CZ 123 2008-12-31 I OAK PEK
6 rows selected
[Quote=引用楼主 gsh945 的帖子:]