powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / help!!!
4 сообщений из 4, страница 1 из 1
help!!!
    #37520616
lubava1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть таблица tab1(pid, predid, wrkid, dorid)
pid связано с tab2.id (сведения персонала)
predid связан с tab3.id (номер предприятия)
wrkid связан с tab4.id (должность)
dorid с tab5.id (станции)

есть список станции(отдельно выданный, но записи их есть в tab5.id неизвестны заранее их) предположим стан1, стан2, стан3...
есть список должности(отдельно выданный, но записи их есть в tab4.id неизвестны заранее их) предположим долж1, долж2, долж3...

составлено мною запрос такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
select count(PR.PID) FROM tab1 PR
          WHERE        PR.WRKID in (select WN.id 
                                    from tab4 WN 
                                    where WN.NAME = 'Долж1')
                       and PR.DORID in (select D.ID 
                                    from tab5 D 
                                    WHERE D.NAME = 'Стан1') and PR.PREDID in (select R.ID_UKR from tab3 R where R.TYPE= 0 )))
так вот, если этот запрос равен 0 то в tab1 надо добавить новую(!) запись где pid, wrkid, dorid будут такими же, а вот predid меняется на значение выполненное запросом:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select PRED.ID_UKR from tab3 where (select PR.PREDID from tab1 PR
          WHERE        PR.WRKID in (select WN.id 
                                    from tab4 WN 
                                    where WN.NAME = 'Долж1')
                       and PR.DORID in (select D.ID 
                                    from tab5 D 
                                    WHERE D.NAME = 'Стан1')
                       and PR.PREDID in (select P.ID from tab3 P where P.TYPE= 0 ))=PRED.ID)

запрос гарантировано выдает одну запись
так же остальные записи можно вытащить запросами:
pid связано с tab2.id (сведения персонала)

predid=
Код: plaintext
1.
2.
3.
4.
5.
6.
select PR.PID from tab1 PR
          WHERE        PR.WRKID in (select WN.id 
                                    from tab4 WN 
                                    where WN.NAME = 'Долж1')
                       and PR.DORID in (select D.ID 
                                    from tab5 D 
                                    WHERE D.NAME = 'Стан1')

wrkid =
Код: plaintext
1.
select WN.id from tab4 WN 
                                    where WN.NAME = 'Долж1')
dorid =
Код: plaintext
1.
2.
select D.ID 
                                    from tab5 D 
                                    WHERE D.NAME = 'Октябрьская')


надо все без процедуры. Согласна даже для каждой станции и должности отдельный запрос на добавление сделать.
пробовала сделать с case, но он не дает мне внутри себя insert сделать. Все запросы данные работают независимо.
Так же пыталась создавать временные таблицы DECLARE GLOBAL TEMPORARY TABLE и заносить в них данные, но данные показывается что занеслись но таблица все равно пустая.
1. Можно ли как то добавить одной функцией это? Естественно не зная заранее результата запросов(работаю на тестовой БД где ключи с рабочей не совпадают)
2. Есть ли возможность вывода это во временные переменные, тока на время выполнения запроса(скрипта)
3. Так же желательно как то хотелось бы занести все Стан в массив для перебора, но это видимо можно исполнить в процедуре и никак больше?
...
Рейтинг: 0 / 0
help!!!
    #37520834
CawaSPb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lubava1991,

Как-то всё противоречиво.

Вот по-человечески переписанный запрос для генерации predid (там, кстати, количество скобок не совпадает).
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select TAB3.ID_UKR
from tab1 join TAB3 on TAB1.predid = TAB3.id
          join TAB4 on TAB1.workid = TAB4.id
          join TAB5 on TAB1.dorid = TAB5.id
where tab4.name = 'Долж1' 
  and tab5.name = 'Стан1'
  and tab3.type =  0 

Т.е. для заданой пары "станция/должность" гарантированнно в таблице будет только одно предпиятие определённого типа, которое выдаст нам следующее предприятие (предприятия организованы в цепочки или деревья).
(Второй раз, кстати, уже не выдаст, если type у них не поменяем).


pid (обозванный ошибочно predid?) вытаскивается уже запросом:
Код: plaintext
1.
2.
3.
4.
5.
select DISTINCT(TAB1.PID)
from tab1 join TAB4 on TAB1.workid = TAB4.id
          join TAB5 on TAB1.dorid = TAB5.id
where tab4.name = 'Долж1' 
   and tab5.name = 'Стан1'

Т.е. для каждой пары "станция/должность" вне зависимости от предприятия будет строго одна соответствующая запись в сведениях о персонале?

Плохо с нормализацией, будут проблемы с написанием селектов, целостностью и всякими сюрпризами (типа потери информации о зависимости станция-должность-свед. о персонале при удалении всех соответствующих записей из t1). Надо бы ещё одну таблицу из (tab2.id, tab4.id, tab5.id)


Ну а вставку можно было бы сделать так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
insert into TAB1
select TAB1.PID, TAB3.ID_UKR, TAB1.WRKID, TAB1.DORID
from tab1 join TAB3 on TAB1.predid = TAB3.id
          join TAB4 on TAB1.workid = TAB4.id
          join TAB5 on TAB1.dorid = TAB5.id
where tab4.name = 'Долж1' -- or IN (......)
  and tab5.name = 'Стан1'  -- or IN (......)
  and tab3.type =  0 

В табличке временной ничего не остаётся, поскольку, видимо, в рамках уже другой транзакции на неё смотрите, попробуйте добавить "ON COMMIT PRESERVE ROWS" в декларацию.
...
Рейтинг: 0 / 0
help!!!
    #37521398
lubava1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
отчего может ругаться на запрос:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
insert into LETD.PERSWRK  PE 
select PE.PID, PR.ID_UKR,  PE.WRKID, PE.ONWORK, PE.DORID
from PE              join LETD.PRED PR       on PE.predid = PR.id
                     join LETD.WRKNAME WR    on PE.workid = WR.id
                     join LETD.DOR D         on PE.dorid = D.id
where WR.vname = 'Начальник вагонного депо' -- or IN (......)
  and D.vname = 'Октябрьская'  -- or IN (......)
  and PR.type =  0 
  and (select count(PE.PID) from LETD.PE
          WHERE        PE.WRKID in (select WR.id 
                                    from WR 
                                    where WR.NAME = 'Начальник вагонного депо')
                       and PE.DORID in (select D.ID 
                                    from D
                                    WHERE D.NAME = 'Октябрьская')
                       and PE.PREDID in (select R.ID_UKR from LETD.PRED R where R.TYPE= 0 ))= 0 
...
Рейтинг: 0 / 0
help!!!
    #37521560
lubava1991
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я решила вопрос. Вышло примерно так для каждой записи:
insert into LETD.PERSWRK
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
select PE.PID,  PR.ID_UKR,  PE.WRKID, PE.ONWORK, PE.DORID
        from LETD.PERSWRK PE
                     join LETD.PRED PR       on PE.predid = PR.id
                     join LETD.PERSONALL L   on PE.pid = L.id
                     join LETD.WRKNAME WR    on PE.wrkid = WR.id
                     join LETD.DOR D         on PE.dorid = D.id
        where WR.name = 'Долж1' -- or IN (......)
             and D.name = 'Стан1'  -- or IN (......)
             and (select count(PE1.PID) from LETD.PERSWRK PE1
                      WHERE        PE1.WRKID in (select WR1.id 
                                    from LETD.WRKNAME WR1 
                                    where WR1.NAME = Долж1')
                                and PE1.DORID in (select D1.ID 
                                    from LETD.DOR D1
                                    WHERE D1.NAME = 'Стан1')
                                and PE1.PREDID in (select PR1.ID_UKR from LETD.PRED PR1 where PR1.TYPE= 0 ))= 0 
and PR.ID_UKR<> 0 


в tab таблицы переименовывать уже не стала. некогда) если кому надо будет - объясню что какая
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / help!!!
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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