|
Люди, помогите с курсорами!!!!!!!
|
|||
---|---|---|---|
#18+
Вообщем у меня такая задачка: допустим у меня дана таблица с ФИО сотрудников, я в 1 курсор выбираю все ID етой таблицы, где имя соответствует запрашиваему во 2 курсор ID таблицы, где Фамилия соответствует искомой, в 3 курсор такж выбираю ID, где отчества соответствуют запрашиваемым Подскажите, как мне пересеч курсоры, так чтобы получилось множество, котявляется пересечение 3-х множеств, на кот указывают курсоры, тобишь мне нужно получить подмножество Людей с искомым ФИО ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2002, 07:05 |
|
Люди, помогите с курсорами!!!!!!!
|
|||
---|---|---|---|
#18+
А при решении задачи обязательно пользоваться курсорами? Можно же все одним запросом сделать. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2002, 07:34 |
|
Люди, помогите с курсорами!!!!!!!
|
|||
---|---|---|---|
#18+
Я тоже так считаю, зачем так извращаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2002, 08:58 |
|
Люди, помогите с курсорами!!!!!!!
|
|||
---|---|---|---|
#18+
Извините, прсто я имел ввиду другой случай, я немного не коректно сформулировал вопрос - у меня сущ. поисковая ф-я, кот ищет по етим полям, мне нужно чтоб она искала по любой комбинации заполненных полей, исключая пустые маски поиска Нюанс еще и в том, что функцию придется расширять за счет поиска по другим свойствам, соответственно увеличивая набор полей и их комбинаций вот вчем вопрос... чтоб мне не писать для каждого случаю свои запросы... ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2002, 10:15 |
|
Люди, помогите с курсорами!!!!!!!
|
|||
---|---|---|---|
#18+
все равно это можно сделать одним запросом select * from mytable where famfield like decode(:fam,null,'%',:fam) and namefield like decode(:name,null,'%',:name) and otchfield like decode (:otch,null,'%',:otch) или я чего не понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2002, 14:01 |
|
Люди, помогите с курсорами!!!!!!!
|
|||
---|---|---|---|
#18+
2 (nick) : Скорее всего -- действительно не понимаешь ... 1) Судя по (0) таблица явно не одна 2) Если поисковый параметр пустой (либо NULL, либо ``) зачем вообще по нему искать? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2002, 06:53 |
|
Люди, помогите с курсорами!!!!!!!
|
|||
---|---|---|---|
#18+
Да, Сильвер прав, фича в чем, у меня несколько полей в таблице, мне нужно провести по ним пойиск, но не искать по тем полям, к кот не обращаются в запросе, тобишь если поисковое значение етого поля равно null или "" то зачем по нему искать? ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2002, 07:33 |
|
Люди, помогите с курсорами!!!!!!!
|
|||
---|---|---|---|
#18+
select ... from table where (param_1 is null or field1 = param_1) and (param_2 is null or field2 = param_2) and (param_3 is null or field3 = param_3) и.т.д стандартная схема пропука пустых параметов. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2002, 08:56 |
|
Люди, помогите с курсорами!!!!!!!
|
|||
---|---|---|---|
#18+
Вот такой запрос будет правильным: SELECT name1, name2, name3 FROM CUSTOMER WHERE NVL(:name_param1,name1) = name1 AND NVL(:name_param2,name2) = name2 AND NVL(:name_param3,name3) = name3 если входные Фам., Имя или Отч. будут пустыми, то по ним не будет производиться поиск в таблице. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2002, 11:36 |
|
Люди, помогите с курсорами!!!!!!!
|
|||
---|---|---|---|
#18+
к Billing Group: > SELECT name1, name2, name3 > FROM CUSTOMER > WHERE NVL(:name_param1,name1) = name1 > AND NVL(:name_param2,name2) = name2 > AND NVL(:name_param3,name3) = name3 Такой запрос в принципе не правильный поскольку: -- в случае :name_param1 is null и name1 is null что в результате -- NVL(:name_param1,name1) полностью выключит индексы и мы получим только и однозначно FULL SCAN TABLE мой вариант тоже не полный т.к. не учитывал null/null значений но в изначальной постановке null для параметра означал, что такой параметр проверять не надо. полная схема проверки, которая сохраняет в живых индексы должна быть: ((param_1 is null or field1 = param_1) or (param_1 is null and field1 is null)) ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2002, 01:41 |
|
Люди, помогите с курсорами!!!!!!!
|
|||
---|---|---|---|
#18+
ShgGena, вообще-то, человек задающий вопрос не упоминал об индексах. Но если тема зашла о них, то в приведенном мною примере, в случае если параметр IS NULL, никак не приведет к полному сканированию таблицы по даному столбцу. Уже сам индекс говорит, что сканировать будут его по FAST FULL SCAN или по RANGE SCAN или еще как-то. Но если подглянуть в Explain Plan, то сразу все станет на свои места. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2002, 02:32 |
|
Люди, помогите с курсорами!!!!!!!
|
|||
---|---|---|---|
#18+
Зачем спорить просто я покужу разницу на примере, включая execution plan --> это очень просто!!! SQL> create table test_plan 2 as 3 select object_id, object_name, object_type 4 from all_objects; Table created. SQL> select count(*) from test_plan; COUNT(*) ---------- 23510 SQL> create index i1_test_plan on test_plan(object_id); Index created. SQL> create index i2_test_plan on test_plan(object_name); Index created. SQL> create index i3_test_plan on test_plan(object_type); Index created. SQL> analyze table test_plan compute statistics; Table analyzed. SQL> set autotrace traceonly; SQL> select * from test_plan 2 where 3 (23 is null or object_id = 23) 4 and 5 (null is null or object_name = 'TEST_PLAN') 6 and 7 ('TABLE' is null or object_type = 'TABLE'); no rows selected Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=2 Card=1 Bytes=38) 1 0 TABLE ACCESS (BY INDEX ROWID) OF 'TEST_PLAN' (Cost=2 Card= 1 Bytes=38) 2 1 BITMAP CONVERSION (TO ROWIDS) 3 2 BITMAP OR 4 3 BITMAP CONVERSION (FROM ROWIDS) 5 4 INDEX (RANGE SCAN) OF 'I1_TEST_PLAN' (NON-UNIQUE) (Cost=1) Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 2 consistent gets 0 physical reads ... 0 rows processed SQL> select * from test_plan 2 where 3 nvl(23,object_id) = object_id 4 and 5 nvl(null,object_name) = object_name 6 and 7 nvl('TABLE',object_type) = object_type; no rows selected Execution Plan ---------------------------------------------------------- 0 SELECT STATEMENT Optimizer=CHOOSE (Cost=17 Card=1 Bytes=38) 1 0 TABLE ACCESS (FULL) OF 'TEST_PLAN' (Cost=17 Card=1 Bytes=3 8) Statistics ---------------------------------------------------------- 0 recursive calls 0 db block gets 149 consistent gets 0 physical reads ... 0 rows processed Прошу обратить внимание на : -- TABLE ACCESS (FULL) OF 'TEST_PLAN' против 2 1 BITMAP CONVERSION (TO ROWIDS) 3 2 BITMAP OR 4 3 BITMAP CONVERSION (FROM ROWIDS) 5 4 INDEX (RANGE SCAN) OF 'I1_TEST_PLAN' (NON-UNIQUE) (Cost=1) поскольку версия 9i то при таких типах запросов оптимизатор бубет пытаться применить onlinr битовые матрицы для выполниея запроса -- очень быстрый способ а также на: 2 consistent gets против 149 consistent gets правда первый запрс смотрится в 30 раз эффективнее... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.12.2002, 07:52 |
|
|
start [/forum/topic.php?fid=52&msg=32073764&tid=1992591]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
56ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 158ms |
0 / 0 |