Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / connect by / 25 сообщений из 51, страница 1 из 3
19.10.2017, 11:42
    #39538578
Озорнитка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
подскажите. пожалуйста,

вот кусочек моего селекта
select g.c_main_v_id -- , g.id , g.id_1, g.lnk_acc, g.h
,
(select count(b1.ID)
from ibs.Z#RKO_CUR b1
where b1.C_ACC_TRANS = g.id) A$2
from (select acc_num.c_main_v_id,
acc_num.id,
acc_num.c_accs_arr,
acc.id id_1,
lnk.c_account lnk_acc,
null h
from Z#LINK_ACCS lnk, z#AC_FIN acc, z#AC_FIN acc_num
where acc.c_ACCS_ARR = lnk.COLLECTION_ID
and lnk.C_VID in (1920715, 9012478)
and lnk.c_account = acc_num.id
--and acc.id in (46666995947)
union
select nvl(acc_num.c_main_v_id, lnk.c_acc_num) c_main_v_id,
acc_num.id,
acc_num.c_accs_arr,
acc.id id_1,
acc_num.id lnk_acc,
null h
from Z#LINK_ACCS lnk, z#AC_FIN acc, z#AC_FIN acc_num
where acc.c_ACCS_ARR = lnk.COLLECTION_ID
and lnk.C_VID in (1920715, 9012478)
and lnk.c_acc_num = acc_num.c_main_v_id(+)
and acc.c_client_v = acc_num.c_client_v(+)
--and acc.id in (46666995947)
) g
connect by prior g.lnk_acc = g.id_1
start with g.id_1 = v_AccId(i) -- 46666995947

не могу придумать, как сделать, чтобы , если отобрался lnk.c_acc_num - отмечен красным. то есть вот это условие не отработает- connect by prior g.lnk_acc = g.id_1, как мне тогда продолжить бы выполнение цикла ? то есть в коннект бай задать два альтернативныху словия- чтобы в зависимости от того, пустой или заполненный acc_num.c_main_v_id,- соединение шло по разным веткам.

это можно сделать?

заранее благодарна.
сильно. поверьте.
...
Рейтинг: 0 / 0
19.10.2017, 11:51
    #39538584
Elic
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
Озорнитказаранее благодарна.
сильно. поверьте.Настолько, что соизволил пренебречь тэгом SRC?!
...
Рейтинг: 0 / 0
19.10.2017, 11:58
    #39538590
Озорнитка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
ElicОзорнитказаранее благодарна.
сильно. поверьте.Настолько, что соизволил пренебречь тэгом SRC?!

соизволилА
...
Рейтинг: 0 / 0
19.10.2017, 11:59
    #39538591
Загги
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
Видали мы эту "благодарность" 20858465
...
Рейтинг: 0 / 0
19.10.2017, 12:01
    #39538594
Озорнитка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
Код: plsql
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.
select g.c_main_v_id -- , g.id , g.id_1, g.lnk_acc, g.h
,
(select count(b1.ID)
from ibs.Z#RKO_CUR b1
where b1.C_ACC_TRANS = g.id) A$2
from (select acc_num.c_main_v_id,
acc_num.id,
acc_num.c_accs_arr,
acc.id id_1,
lnk.c_account lnk_acc,
null h
from Z#LINK_ACCS lnk, z#AC_FIN acc, z#AC_FIN acc_num
where acc.c_ACCS_ARR = lnk.COLLECTION_ID
and lnk.C_VID in (1920715, 9012478)
and lnk.c_account = acc_num.id
--and acc.id in (46666995947) 
union
select nvl(acc_num.c_main_v_id, lnk.c_acc_num) c_main_v_id,
acc_num.id,
acc_num.c_accs_arr,
acc.id id_1,
acc_num.id lnk_acc,
null h
from Z#LINK_ACCS lnk, z#AC_FIN acc, z#AC_FIN acc_num
where acc.c_ACCS_ARR = lnk.COLLECTION_ID
and lnk.C_VID in (1920715, 9012478)
and lnk.c_acc_num = acc_num.c_main_v_id(+)
and acc.c_client_v = acc_num.c_client_v(+)
--and acc.id in (46666995947)
) g
connect by prior g.lnk_acc = g.id_1
start with g.id_1 = v_AccId(i) -- 46666995947
...
Рейтинг: 0 / 0
19.10.2017, 12:02
    #39538596
Озорнитка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
ЗаггиВидали мы эту "благодарность" 20858465

так это причем ? там пример, описывающий связь в другую сторону- не от меня к вам , а от вас ко мне.
А благодарность- это от меня к вам, к той ситуации отношения не имеет
...
Рейтинг: 0 / 0
19.10.2017, 12:05
    #39538599
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
Озорнитка,

А менее загруженный селект нельзя было придумать?
Ну или примерчик набросать?

Пока могу сказать:
Озорниткаесли отобрался lnk.c_acc_num - отмечен красным. то есть вот это условие не отработает- connect by prior g.lnk_acc = g.id_1
верю на слово, хтоя подразумеваю что отработает но не так как Вам бы хотелось

Озорниткато есть в коннект бай задать два альтернативныху словия- чтобы в зависимости от того, пустой или заполненный acc_num.c_main_v_id,- соединение шло по разным веткам.
А, извините, какие? Первое prior g.lnk_acc = g.id_1 - вижу (к c_main_v_id отношения не имеет), а второй?
...
Рейтинг: 0 / 0
19.10.2017, 12:19
    #39538613
Озорнитка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
MaximaXXLОзорнитка,

А менее загруженный селект нельзя было придумать?
Ну или примерчик набросать?

Пока могу сказать:
Озорниткаесли отобрался lnk.c_acc_num - отмечен красным. то есть вот это условие не отработает- connect by prior g.lnk_acc = g.id_1
верю на слово, хтоя подразумеваю что отработает но не так как Вам бы хотелось

Озорниткато есть в коннект бай задать два альтернативныху словия- чтобы в зависимости от того, пустой или заполненный acc_num.c_main_v_id,- соединение шло по разным веткам.
А, извините, какие? Первое prior g.lnk_acc = g.id_1 - вижу (к c_main_v_id отношения не имеет), а второй?

все отработает . как надо- поскольку я уже все оттестировала

g.lnk_acc = g.id_1 - имеет отношение к c_main_v_id,

1) спускаемся вниз от acc.id: lnk- по collection_id связано с acc (ACCS_ARR =collection_id и все lnk.id , у которых такой колекшен - относятся к acc ), затем у LNK берем ACCOUNT и теперь принимаем его за acc

2) так же спускаемся вниз от acc: тот же lnk, тот же коллекшион, но теперь счет может быть записан не в виде ссылки ACCOUNT, а просто - норме строкой acc_num. Теперь нам надо в фин счетах найти нужный счет и опять принять его за acc/
Проблема в том, что данные могут быть ошибочны и может быть указан номер счета, который в базе не существует, и в таком случае мне хотелось бы в коннект бай указать другое условие

аналогичный селект (просто с другими условиями) есть для поиска 'вверх', но его смысла нет приводить.
...
Рейтинг: 0 / 0
19.10.2017, 12:27
    #39538622
Озорнитка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
ну вообще, для моей практической задачи уже все работает , как нужно- несуществующий счет может быть только в самом низу выборки, и сейчас он отбирается благополучно. во втором union (записанный строкой . а не ссылкой в acc_num несуществующий счет), то есть только перенесенный после миграции номер счета для истории .

а ошибочных данных - я поискала в базе- вроде как пока нет.

но просто стало интересно, а если бы были- то можно ли это сделать одним запросом
...
Рейтинг: 0 / 0
19.10.2017, 12:52
    #39538643
Озорнитка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
короче, надо было тему под другим ником создать :)

а то злопамятные )
...
Рейтинг: 0 / 0
19.10.2017, 12:54
    #39538646
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
Озорнитка,

вникать в прикладную логику Вашего запроса не очень хочеться (в тч напр зачем нужен null h)

подготовте тестовые данные с помощую with "c ошибочными данными"
и покажите результат: есть/получаю, надо ....

мож кто-то и заинтереcуется задачкой/проблемкой, или сами решение найдете на более прозрачных данных

.....
stax
...
Рейтинг: 0 / 0
19.10.2017, 13:11
    #39538661
Озорнитка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
да это колонка для селекта поиска вверх, там оно заполняется, а себе сделала одинаковый набор в обоих запросах, чтобы не запутаться

блен, я with не пользуюсь никогда :(

ну ладно, сделаю, выложу
...
Рейтинг: 0 / 0
19.10.2017, 13:51
    #39538692
loperf
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
ооо, таблицы из ЦФТ ;)
...
Рейтинг: 0 / 0
19.10.2017, 13:58
    #39538701
Озорнитка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
loperfооо, таблицы из ЦФТ ;)

когда я уже уйду от Цфт :(

хочу проста на пл скул.. и еще лучше в придачу с жабой. Ваще была бы счастлива
...
Рейтинг: 0 / 0
19.10.2017, 13:59
    #39538702
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
Озорниткаблен, я with не пользуюсь никогда :(


не обязательно with, просто удобно

можна пойти по официальному пути
http://www.sql.ru/forum/rules.aspx
При написании сообщений с просьбой о составлении запроса - хорошим тоном считается предоставление скрипта на создание таблицы и заполнение ее тестовыми данными, а также ожидаемого результата выборки, если это не очевидно из вопроса. Например:
...


....
stax
...
Рейтинг: 0 / 0
19.10.2017, 14:00
    #39538708
j2k
j2k
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
Озорниткакогда я уже уйду от Цфт :(

Паспорт отобрали? :D
...
Рейтинг: 0 / 0
20.10.2017, 10:23
    #39539360
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
Озорнитка,

Код: plsql
1.
connect by case when ... 
...
Рейтинг: 0 / 0
20.10.2017, 10:29
    #39539367
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
Озорнитка,

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
with t as (
           select 1 id, cast(null as number) parent_id, 0 as flag from dual union all
           select 2 id, 1 parent_id, 0 as flag from dual union all
           select 3 id, 2 parent_id, 0 as flag from dual union all
           select 4 id, -2 parent_id, null as flag from dual
)
select t.*, prior id id_p
from t
connect by (case flag when 0 then prior id else (prior id)*-1 end) = parent_id
start with parent_id is null



Какой вопрос, такой и ответ
...
Рейтинг: 0 / 0
20.10.2017, 12:06
    #39539454
Озорнитка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
у меня дома нет компа щас,

я на работе вечером, када от меня отстанут пользователи, заведу тестовые таблички. Мож у самой получится додуматься :)
...
Рейтинг: 0 / 0
20.10.2017, 12:31
    #39539466
MaximaXXL
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
env,

Можно и так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with t as (
           select 1 id, cast(null as number) parent_id, 0 as flag from dual union all
           select 2 id, 1 parent_id, 0 as flag from dual union all
           select 3 id, 2 parent_id, 0 as flag from dual union all
           select 4 id, -2 parent_id, null as flag from dual
)
select t.*, prior id id_p
from t
connect by --(case flag when 0 then prior id else (prior id)*-1 end) = parent_id
           nvl2(flag, (prior id), (prior id)*-1) = parent_id
start with parent_id is null



Если проблема с null
...
Рейтинг: 0 / 0
20.10.2017, 12:35
    #39539473
env
env
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
MaximaXXL,

Case проще расширить, для нескольких условий. Вырожденный случай можно покрыть и более узким решением.
...
Рейтинг: 0 / 0
23.10.2017, 19:58
    #39540738
Озорнитка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
cast(null as number)- это зачем
...
Рейтинг: 0 / 0
23.10.2017, 20:08
    #39540744
andrey_anonymous
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
Озорниткаcast(null as number)- это зачем
Тип поля задает.
...
Рейтинг: 0 / 0
23.10.2017, 20:19
    #39540747
Озорнитка
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
andrey_anonymousОзорниткаcast(null as number)- это зачем
Тип поля задает.

так и без этого работает

оракл неявно преобразует?
...
Рейтинг: 0 / 0
24.10.2017, 09:28
    #39540846
Да ну?
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
connect by
Озорниткаandrey_anonymousпропущено...

Тип поля задает.
так и без этого работает
Union определяет структуру набора по первому select.
Вопрос: какого типа поле получается из null?
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / connect by / 25 сообщений из 51, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]