Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как отобрать записи?  [new]
самбади
Guest
В столбце имеются записи вида: 123/456, 123, 456, 45000/69999, 45000,..... Подскажите пожалуйста как отобрать все записи которые присутствуют по обе стороны "/" для их подальшего удаления?
23 июл 09, 17:25    [7452888]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
Dnipro
Member

Откуда: Днепропетровск
Сообщений: 180
instr
23 июл 09, 17:28    [7452909]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
самбади,

поясните, что надо
(записи, вообще то, присутствуют в ~таблице/запросе, а отбирать, обычно, приходится по,
например, наличию ~подстроки в таком - то месте такого - то атрибута ..)
23 июл 09, 17:37    [7452997]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
Elic
Member

Откуда:
Сообщений: 29990
select t1.* 
  from t t1, t t2 
  where t2.col like t1.col || '/%' 
     or t2.col like          '%/' || t1.col;
23 июл 09, 17:42    [7453034]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
azzy
Member

Откуда:
Сообщений: 149
самбади,

если в строке м.б. только один символ можно попробовать
instr(<yourfield_name>, '/')<length(<yourfield_name>)
ну и там trim по необходимости... как-то так

хотя вариант
like '%/%'
никто не отменял.
23 июл 09, 18:06    [7453207]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
самбади
Guest
id col
1 123/456
2 123
3 456
4 45000/69999
5 45000
6 5000
..............

В данном наборе, например, нужно повыбирать и поудалять 123, 456, 45000, 69999.

select t1.* 
  from my_tab t1 
 where t1.col like t1.col || '/%' 
     or t1.col like '%/' || t1.col;
- не возвращает ничего..
чего-то недопонимаю или не так спрашиваю..
23 июл 09, 18:21    [7453258]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
самбади,

освойте копипаст. :) Сравните внимательно Ваш запрос и запрос, который предложил Elic.
23 июл 09, 18:24    [7453267]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
самбади
Guest
suPPLer,
такой запрос как у Elic выдает мне сost 269.396.336, ибо обращаюсь к вьюхе по линку.. боюсь не дождатся результатов работы!
23 июл 09, 18:32    [7453302]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
самбади,

если разделитель именно слэш ('/' который), то можно попробовать вариант:

select * 
  from t
 where instr(t.col, '/') = 0
23 июл 09, 18:40    [7453322]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
Elic
Member

Откуда:
Сообщений: 29990
самбади
.. боюсь не дождатся результатов работы!
И поэтому делаешь неправильно, зато быстро ?!
23 июл 09, 18:45    [7453343]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
самбади
Guest
Elic
самбади
.. боюсь не дождатся результатов работы!
И поэтому делаешь неправильно, зато быстро ?!

в точку!)))

suPPLer,
да, но тогда в выборку попадут все записи без слэша, а мне нужны только те, которые идентичны записям, что по обе стороны слэша
23 июл 09, 18:51    [7453355]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
самбади,

да, не досмотрел. Но тогда решение задачи Elic Вам дал.
23 июл 09, 18:55    [7453363]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
самбади

Подскажите пожалуйста как отобрать все записи которые присутствуют по обе стороны "/"
..

самбади


id col
1 123/456
2 123
3 456
4 45000/69999
5 45000
6 5000
..............

В данном наборе, например, нужно повыбирать и поудалять 123, 456, 45000, 69999.

самбади

..
да, но тогда в выборку попадут все записи без слэша, а мне нужны только те, которые идентичны записям, что по обе стороны слэша


господа телепаты! если кто владеет русским письменным, объясните мне, тупомому:
что автору таки надо?
23 июл 09, 20:07    [7453563]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
Elic
Member

Откуда:
Сообщений: 29990
orawish
господа телепаты! если кто владеет русским письменным, объясните мне, тупомому:
что автору таки надо?
Выбрать/удалить "номера", присутствующие в спаренных :)
23 июл 09, 20:11    [7453578]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Я тут подумал... Может, такое побыстрее будет:

select *
  from t t1
 where instr(t1.col, '/')=0
   and exists (select null from t t2
                where t2.col like t1.col || '/%'
                   or t2.col like '%/' || t1.col)
23 июл 09, 20:23    [7453618]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
Elic
Member

Откуда:
Сообщений: 29990
suPPLer
Я тут подумал... Может, такое побыстрее будет
Коррелированный full scan? :)
23 июл 09, 20:44    [7453647]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Elic,

в обоих случаях по два фуллскана... Но мой вариант мне пока больше нравится. Возможно, я в чём-то не прав. :)

+
SQL*Plus: Release 10.2.0.1.0 - Production on Чт Июл 23 21:44:37 2009

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

SQL> conn xxx/xxxxx
Connected.

SQL> create table t as
  2  select to_char(level*3) || '/' || to_char(level*2) col from dual connect by level <= 1000
  3   union all
  4  select to_char(level) col from dual connect by level <= 1000;

Table created.

SQL> exec dbms_stats.gather_table_stats(user, 'T', cascade => true);

PL/SQL procedure successfully completed.

SQL> explain plan for
  2  select t1.col           
  3    from t t1, t t2
  4   where t2.col like t1.col || '/%'
  5      or t2.col like '%/' || t1.col
  6  ;

Explained.

SQL> select * from table(dbms_xplan.display('plan_table', null, 'ALL'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3382321088

---------------------------------------------------------------------------
| Id  | Operation	   | Name | Rows  | Bytes | Cost (%CPU)| Time	  |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |	  |   390K|  4570K|  3887   (3)| 00:00:47 |
|   1 |  NESTED LOOPS	   |	  |   390K|  4570K|  3887   (3)| 00:00:47 |
|   2 |   TABLE ACCESS FULL| T	  |  2000 | 12000 |	4   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| T	  |   195 |  1170 |	2   (0)| 00:00:01 |
---------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   2 - SEL$1 / T1@SEL$1
   3 - SEL$1 / T2@SEL$1

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("T2"."COL" LIKE "T1"."COL"||'/%' OR "T2"."COL" LIKE
	      '%/'||"T1"."COL")

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - (#keys=0) "T1"."COL"[VARCHAR2,81]
   2 - "T1"."COL"[VARCHAR2,81]

29 rows selected.

SQL> explain plan for
  2  select t1.*  
  3    from t t1
  4   where instr(t1.col, '/')=0
  5     and exists (select null from t t2 
  6                  where t2.col like t1.col || '/%'
  7                     or t2.col like '%/' || t1.col)
  8  ;

Explained.

SQL> select * from table(dbms_xplan.display('plan_table', null, 'ALL'));

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 366813129

---------------------------------------------------------------------------
| Id  | Operation	   | Name | Rows  | Bytes | Cost (%CPU)| Time	  |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |	  |	1 |	6 |    24   (0)| 00:00:01 |
|*  1 |  FILTER 	   |	  |	  |	  |	       |	  |
|*  2 |   TABLE ACCESS FULL| T	  |    20 |   120 |	4   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| T	  |	1 |	6 |	2   (0)| 00:00:01 |
---------------------------------------------------------------------------

Query Block Name / Object Alias (identified by operation id):
-------------------------------------------------------------

   1 - SEL$1
   2 - SEL$1 / T1@SEL$1
   3 - SEL$2 / T2@SEL$2

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter( EXISTS (SELECT /*+ */ 0 FROM "T" "T2" WHERE "T2"."COL"

PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
	      LIKE :B1||'/%' OR "T2"."COL" LIKE '%/'||:B2))
   2 - filter(INSTR("T1"."COL",'/')=0)
   3 - filter("T2"."COL" LIKE :B1||'/%' OR "T2"."COL" LIKE '%/'||:B2)

Column Projection Information (identified by operation id):
-----------------------------------------------------------

   1 - "T1"."COL"[VARCHAR2,81]
   2 - "T1"."COL"[VARCHAR2,81]
   3 - "T2"."COL"[VARCHAR2,81]

32 rows selected.
23 июл 09, 23:06    [7453895]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
И даже так (данные уже в буферном кэше):

+
SQL> set autotrace traceonly;
SQL> select t1.col
  2     from t t1, t t2
  3   where t2.col like t1.col || '/%'
  4      or t2.col like '%/' || t1.col
  5  ; 

833 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 3382321088

---------------------------------------------------------------------------
| Id  | Operation	   | Name | Rows  | Bytes | Cost (%CPU)| Time	  |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |	  |   390K|  4570K|  3887   (3)| 00:00:47 |
|   1 |  NESTED LOOPS	   |	  |   390K|  4570K|  3887   (3)| 00:00:47 |
|   2 |   TABLE ACCESS FULL| T	  |  2000 | 12000 |	4   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| T	  |   195 |  1170 |	2   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   3 - filter("T2"."COL" LIKE "T1"."COL"||'/%' OR "T2"."COL" LIKE
	      '%/'||"T1"."COL")


Statistics
----------------------------------------------------------
	  1  recursive calls
	  0  db block gets
      12118  consistent gets
	  0  physical reads
	  0  redo size
      14176  bytes sent via SQL*Net to client
	989  bytes received via SQL*Net from client
	 57  SQL*Net roundtrips to/from client
	  0  sorts (memory)
	  0  sorts (disk)
	833  rows processed

SQL> select t1.col
  2    from t t1
  3   where instr(t1.col, '/')=0
  4     and exists (select null from t t2
  5                  where t2.col like t1.col || '/%'
  6                     or t2.col like '%/' || t1.col)
  7  ;

667 rows selected.


Execution Plan
----------------------------------------------------------
Plan hash value: 366813129

---------------------------------------------------------------------------
| Id  | Operation	   | Name | Rows  | Bytes | Cost (%CPU)| Time	  |
---------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |	  |	1 |	6 |    24   (0)| 00:00:01 |
|*  1 |  FILTER 	   |	  |	  |	  |	       |	  |
|*  2 |   TABLE ACCESS FULL| T	  |    20 |   120 |	4   (0)| 00:00:01 |
|*  3 |   TABLE ACCESS FULL| T	  |	1 |	6 |	2   (0)| 00:00:01 |
---------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter( EXISTS (SELECT /*+ */ 0 FROM "T" "T2" WHERE "T2"."COL"
	      LIKE :B1||'/%' OR "T2"."COL" LIKE '%/'||:B2))
   2 - filter(INSTR("T1"."COL",'/')=0)
   3 - filter("T2"."COL" LIKE :B1||'/%' OR "T2"."COL" LIKE '%/'||:B2)


Statistics
----------------------------------------------------------
	  1  recursive calls
	  0  db block gets
       4050  consistent gets
	  0  physical reads
	  0  redo size
       9477  bytes sent via SQL*Net to client
	868  bytes received via SQL*Net from client
	 46  SQL*Net roundtrips to/from client
	  0  sorts (memory)
	  0  sorts (disk)
	667  rows processed

SQL> 


PS: Elic, ну и для удаления, в общем, пофиг, но для запроса выделенные циферки важны. :)
-------------------------------------------------------
When I say "RTFM" or "STFF" or "STFW",
the third letter means "Following" or "Fine"...
24 июл 09, 00:13    [7454005]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10051
suPPLer
в обоих случаях по два фуллскана... Но мой вариант мне пока больше нравится. Возможно, я в чём-то не прав. :)


Well, if col is indexed I would try

select  * 
  from  t 
  where col in (
                select  regexp_substr(col,'/d+',1,lvl)
                  from  t,
                        (
                         select  level lvl
                           from  dual
                           connect by level <= 2
                        )
                  where instr(t.col,'/') > 0
               )
/

SY.

Сообщение было отредактировано: 24 июл 09, 01:45
24 июл 09, 01:42    [7454094]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
SY,

"если" - это уже нужно уточнить. Уважаемый самбади, у Вас табличка по этому столбцу проиндексирована?
24 июл 09, 01:48    [7454096]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
stax..
Guest
самбади
В столбце имеются записи вида: 123/456, 123, 456, 45000/69999, 45000,..... Подскажите пожалуйста как отобрать все записи которые присутствуют по обе стороны "/" для их подальшего удаления?

что-то я вопрос недопонял
  1  select * from (
  2   select '122' s  from dual union all
  3   select '1223/'  from dual union all
  4   select '/122'   from dual union all
  5   select '122/34' from dual union all
  6   select '/'      from dual
  7* ) t where s like '%_/_%'
SQL> /

S
------
122/34

SQL> 
24 июл 09, 09:43    [7454511]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
самбади
Guest
suPPLer,
проиндексирована, но вариант, предложенный SY, ничего не возвращает..
24 июл 09, 09:49    [7454536]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
stax..
Guest
orawish
самбади

Подскажите пожалуйста как отобрать все записи которые присутствуют по обе стороны "/"
..

самбади


id col
1 123/456
2 123
3 456
4 45000/69999
5 45000
6 5000
..............

В данном наборе, например, нужно повыбирать и поудалять 123, 456, 45000, 69999.

самбади

..
да, но тогда в выборку попадут все записи без слэша, а мне нужны только те, которые идентичны записям, что по обе стороны слэша


господа телепаты! если кто владеет русским письменным, объясните мне, тупомому:
что автору таки надо?


ааааааааа понял
123/456
45000/69999

ети и надо удалить 123, 456, 45000, 69999

за один проход имхо не получится
24 июл 09, 09:57    [7454582]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
самбади
Guest
stax..,
а за сколько проходов? это же должно как-то решатся?
24 июл 09, 10:03    [7454620]     Ответить | Цитировать Сообщить модератору
 Re: Как отобрать записи?  [new]
Elic
Member

Откуда:
Сообщений: 29990
самбади
вариант, предложенный SY, ничего не возвращает..
Ну описался человек, не тот косяк в регулярусе воткнул. А ты и головой уже собственной подумать не в состоянии :)
24 июл 09, 10:13    [7454651]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить