1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161
| SQL> WITH T1 AS
2 (
3 SELECT 6 id1, 'A' nm1 FROM dual union ALL
4 SELECT 8 , 'A' FROM dual union ALL
5 SELECT 9 , 'B' FROM dual union ALL
6 SELECT 10 , 'A' FROM dual union ALL
7 SELECT 11 , 'A' FROM dual
8 ), T2 AS
9 (
10 SELECT 0 id2, 'A' nm2 FROM dual union ALL
11 SELECT 1 , 'B' FROM dual union ALL
12 SELECT 2 , 'B' FROM dual union ALL
13 SELECT 3 , 'B' FROM dual union ALL
14 SELECT 4 , 'B' FROM dual union ALL
15 SELECT 5 , 'A' FROM dual union ALL
16 SELECT 6 , 'B' FROM dual union ALL
17 SELECT 7 , 'A' FROM dual union ALL
18 SELECT 8 , 'A' FROM dual union ALL
19 SELECT 9 , 'B' FROM dual union ALL
20 SELECT 10 , 'B' FROM dual union ALL
21 SELECT 11 , 'B' FROM dual union ALL
22 SELECT 12 , 'A' FROM dual union ALL
23 SELECT 13 , 'A' FROM dual
24 ), ECART AS
25 (
26 select &ecart as ecart_valeur from dual
27 ), T3 AS
28 (
29 select nm2, min(id2) min_id2, max(id2) max_id2
30 from T1,
31 T2,
32 ECART
33 WHERE T1.id1 BETWEEN (T2.id2 - ecart_valeur) AND (T2.id2 + ecart_valeur)
34 AND T1.nm1=T2.nm2
35 group by nm2
36 ),M AS
37 (
38 SELECT T1.*,
39 T2.*,row_number() over (partition BY id1 ORDER BY id2) rn1,
40 row_number() over (partition BY id2 ORDER BY id1) rn2,
41 min_id2,max_id2
42 FROM T1,
43 T2,
44 T3
45 WHERE T2.id2 BETWEEN min_id2 AND max_id2
46 AND T1.nm1=T2.nm2
47 AND T1.nm1=T3.nm2
48 )
49 SELECT m.id1,nm1,id2,nm2
50 FROM m, ecart
51 WHERE id1 between (id2 - ecart_valeur) and (id2 + ecart_valeur)
52 AND decode(ecart_valeur,0,-1,rn1)=decode(ecart_valeur,0,-1,rn2)
53 ORDER BY id1 ASC, id2 ASC;
Enter value for ecart: 0
old 26: select &ecart as ecart_valeur from dual
new 26: select 0 as ecart_valeur from dual
ID1 N ID2 N
---------- - ---------- -
8 A 8 A
9 B 9 B
Elapsed: 00:00:00.00
SQL> /
Enter value for ecart: 1
old 26: select &ecart as ecart_valeur from dual
new 26: select 1 as ecart_valeur from dual
ID1 N ID2 N
---------- - ---------- -
6 A 5 A
8 A 7 A
9 B 9 B
11 A 12 A
Elapsed: 00:00:00.00
SQL> /
Enter value for ecart: 2
old 26: select &ecart as ecart_valeur from dual
new 26: select 2 as ecart_valeur from dual
ID1 N ID2 N
---------- - ---------- -
6 A 5 A
8 A 7 A
9 B 9 B
10 A 8 A
11 A 12 A
Elapsed: 00:00:00.00
SQL> /
Enter value for ecart: 3
old 26: select &ecart as ecart_valeur from dual
new 26: select 3 as ecart_valeur from dual
ID1 N ID2 N
---------- - ---------- -
6 A 5 A
8 A 7 A
9 B 6 B
10 A 8 A
11 A 12 A
Elapsed: 00:00:00.00
SQL> /
Enter value for ecart: 4
old 26: select &ecart as ecart_valeur from dual
new 26: select 4 as ecart_valeur from dual
ID1 N ID2 N
---------- - ---------- -
6 A 5 A
8 A 7 A
9 B 6 B
10 A 8 A
11 A 12 A
Elapsed: 00:00:00.00
SQL> /
Enter value for ecart: 5
old 26: select &ecart as ecart_valeur from dual
new 26: select 5 as ecart_valeur from dual
ID1 N ID2 N
---------- - ---------- -
6 A 5 A
8 A 7 A
9 B 4 B
10 A 8 A
11 A 12 A
Elapsed: 00:00:00.00
SQL> /
Enter value for ecart: 6
old 26: select &ecart as ecart_valeur from dual
new 26: select 6 as ecart_valeur from dual
ID1 N ID2 N
---------- - ---------- -
6 A 0 A
8 A 5 A
9 B 3 B
10 A 7 A
11 A 8 A
Elapsed: 00:00:00.00
SQL> /
Enter value for ecart: 7
old 26: select &ecart as ecart_valeur from dual
new 26: select 7 as ecart_valeur from dual
ID1 N ID2 N
---------- - ---------- -
6 A 0 A
8 A 5 A
9 B 2 B
10 A 7 A
11 A 8 A
Elapsed: 00:00:00.00
SQL> |
Partager