Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
есть 2 связанные таблицы: одна дочерняя с одним примари кеем и основная соответственно с одним примари кеем и одним форин кеем, кот в свою очередь я вляется примари кеем в дочерней(как то замудренно вышло)!
ну обычная схема... Дочерняя таблица заполнена...
Например:
kod_i(PK) kod_ii(PK)
kod_ii(FPK) name_ii
name

имеется третья большая таблица в ней все эти 2 таблицы находятся(и не только солянка короче)! необходимо правильно перенести данные! тоесть сразу же я не смогу основную заполнить будет ругаться будет на форин кей который not null! мне зна надо сначала по данным из дочерней таблицы по полю name_ii определить kod_ii и потом записать его в kod_ii(FPK) основной таблицы а потом уже и поле name!

Нужен пример кода на sql...
23 апр 08, 11:12    [5583734]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
Многотабличный INSERT тебе в помощь.
23 апр 08, 11:14    [5583750]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
Бабичев Сергей
Многотабличный INSERT тебе в помощь.

Ёмко...
23 апр 08, 11:16    [5583765]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
Бабичев Сергей
Member

Откуда:
Сообщений: 2498
kasik
Бабичев Сергей
Многотабличный INSERT тебе в помощь.

Ёмко...
Направление тебе указали. Попробуй немного приложить усилий и воспользоваться хотя бы поиском по форуму...
23 апр 08, 11:37    [5583938]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Multitable Inserts: Examples
23 апр 08, 12:06    [5584258]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
По поводу этой вставки доки посмотрел завтра буду эксперементировать...
Но как лучше сделать в моей ситуации:
будет периодически синхронизироваться эта "третья большая таблица" и мои две! как лючше производить проверки о необходимости синхранизации? Хранить колво строк основной табл в другой вспомогательной табличке и сравнивать периодически это значение с фактическим колво строк "третья большая таблица" и при необходимости....
23 апр 08, 20:07    [5587719]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
Или можно обойтись без дополнительной таблицы!?
24 апр 08, 09:06    [5588691]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
work-sa
Member

Откуда: Сухум
Сообщений: 263
kasik
Но как лучше сделать в моей ситуации:
будет периодически синхронизироваться эта "третья большая таблица" и мои две! как лючше производить проверки о необходимости синхранизации?

Не большой спец, но организация данных весьма странная.
Может стоит посмотреть в сторону view или materialization view?
24 апр 08, 10:02    [5588955]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
work-sa
Member

Откуда: Сухум
Сообщений: 263
Извиняюсь "materialized".
24 апр 08, 10:05    [5588973]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
work-sa
kasik
Но как лучше сделать в моей ситуации:
будет периодически синхронизироваться эта "третья большая таблица" и мои две! как лючше производить проверки о необходимости синхранизации?

Не большой спец, но организация данных весьма странная.
Может стоит посмотреть в сторону view или materialization view?


Посмотрел я в эту сторону! чето не то!
Использовал
INSERT ALL! больно запвренный запрос вышел в результаье "0 строк добавлено"!
24 апр 08, 14:08    [5591115]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
Неделю уже занимаюсь этой тривиальной задачей!Без результатно! поидее при приеме данных из внешних источников это стандартная задача! не уже ли ее никто не решал!? Мульти тэйбл инсерт не совсем подходит для этого так он распихивает данные по нескольким таблизам из одной а мне надо наоборот из нескольких в одну! пробовал спользовать триггеры! тоже не получилось!!!
26 апр 08, 20:18    [5600358]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
SimonInBlues
Member

Откуда: Балаково
Сообщений: 264
kasik
Неделю уже занимаюсь этой тривиальной задачей!Без результатно! поидее при приеме данных из внешних источников это стандартная задача! не уже ли ее никто не решал!? Мульти тэйбл инсерт не совсем подходит для этого так он распихивает данные по нескольким таблизам из одной а мне надо наоборот из нескольких в одну! пробовал спользовать триггеры! тоже не получилось!!!

если у тебя в "третьей" таблице имеются данные из "первой" и "второй" и ты однозначно можешь их получить с помощью неких трансформаций оригинальных данных, то напиши два представления, опирающиеся на "третью" таблицу и разворачивающую их в формате "первой" и "второй". Если у тебя используются последовательности, то можешь делать вставки данных процедурно: т.е. при вставке записи в мастер-таблицу вычислить ее первичный ключ, сохранить его значение в переменную, а затем вставить в дочернюю таблицу записи с уже вычислнной ссылкой на мастер-таблицу.
PS: ты немного напутал с понятием дочерней таблицы: на самом деле дочерняя - эта та таблица, которая имеет ссылку на другую мастер-таблицу, а не наоборот, как написал ты.
26 апр 08, 21:32    [5600478]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
Soft Wind
Member

Откуда:
Сообщений: 170
kasik
Неделю уже занимаюсь этой тривиальной задачей!Без результатно! поидее при приеме данных из внешних источников это стандартная задача! не уже ли ее никто не решал!? Мульти тэйбл инсерт не совсем подходит для этого так он распихивает данные по нескольким таблизам из одной а мне надо наоборот из нескольких в одну! пробовал спользовать триггеры! тоже не получилось!!!


Обычно в 99.999% всё лечится либо посредством view, либо посредством matview.
Нужен конкретный ответ, задавай конкретный вопрос - структура данных на входе, структура на выходе, куда и как часто синхронизить.

Пока что всё описанное вами, мягко говоря,- не технологично.
28 апр 08, 10:56    [5603012]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
badmintonist
Member

Откуда:
Сообщений: 330
kasik

SQL> create table t1(x number, constraint t1_pk  primary key (x));

Table created.

SQL> create table t2(y number, x number not null,
  2  constraint t2_pk primary key (y),
  3  constraint t2_t1_fk foreign key (x) references t1(x));

Table created.

SQL> create table t3(y number, x number);

Table created.

SQL> insert into t3
  2  select 101, 1 from dual union all
  3  select 102, 1 from dual union all
  4  select 103, 1 from dual union all
  5  select 201, 2 from dual union all
  6  select 202, 2 from dual union all
  7  select 705, 5 from dual;

6 rows created.
Ты это хотел сделать:
SQL> insert into t1(x) select x from t3 group by x;

3 rows created.

SQL> insert into t2(y,x) select y,x from t3;

6 rows created.
?

kasik
Нужен пример кода на sql...
А пример исходных данных и того что ты хочешь из них получить сделать не судьба?
28 апр 08, 11:59    [5603385]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
Помогите оптимизировать(переделать) мультивставку:
есть таблицы:
Create table my_tabl (
"Kod" Number NOT NULL ,
"KOD_RAB" Number NOT NULL ,
"KOD_RAB_VIDAN" Number,
"Kod_R" Number NOT NULL ,
"Kod_Vip" Number NOT NULL ,
"Kod_UVED_OTP" Number NOT NULL ,
"Kod_UVED_POL" Number NOT NULL ,
"KOD_DOC" Number NOT NULL ,
"VID_KTC" Char (1),
"TYP_DTC" Char (1),
"G071" Varchar2 (8) NOT NULL ,
"G072" Date,
"G073" Char (7),
"G011" Char (2),
"G032" Number(5,0),
"GD1" Date,
"ETAG" Number,
"STILAJ" Number,
"POLKA" Number,
"TOM" Number,
"Primech" Varchar2 (20),
primary key ("Kod")
)

Create table GLAV (
"VID_KTC" Char (1),
"TYP_DTC" Char (1),
"G071" Varchar2 (8) NOT NULL ,
"G072" Date,
"G073" Char (7),
"G011" Char (2),
"G032" Number(5,0),
"GD1" Date,
"G022" Char (80),
"G082" Char (80),
"GD0" Char (2)
)

Create table "UVED" ( --контрагенты
"Kod_UVED" Number NOT NULL ,
"INN" Varchar2 (12),
"ZAYV" Varchar2 (80),
"TELEFON" Varchar2 (12),
"SCHET1" Varchar2 (20),
"KORSCHR" Varchar2 (20),
"OKPOBV" Varchar2 (10),
"SCHET2" Varchar2 (20),
"DATR" Date,
"KPP" Varchar2 (9),
"DATN" Date,
"DATM" Date,
"SUBCNTRY" Varchar2 (35),
"CITY" Varchar2 (35),
"STREET" Varchar2 (35)
primary key ("Kod_UVED")
)

Create table REP (
"Kod_R" Number NOT NULL ,
"KOD" Varchar2 (2),
"NAIM" Varchar2 (250),
"DATBEG" Date,
"DATEND" Date
primary key ("Kod_R")
)
/

Create table VID_V (
"Kod_Vip" Number NOT NULL ,
"Code" Varchar2 (2),
"Name" Varchar2 (250),
"DATBEG" Date,
"DATEND" Date
primary key ("Kod_Vip")
)

Create table TOVAR (
"G071" Varchar2 (8),
"G072" Date,
"G073" Char (7),
"G037" Char (80)
)


INSERT ALL
INTO my_tabl
VALUES( SQ_MY.nextval, DECODE(p3, '10', 1,
'20', 2,
'30', 3,
'40', 4, NULL),
p15, p16, p19, p20, 1, p1, p2, p3, p4, p5, p6, p8, p10 )
SELECT a.VID_KTC p1, a.TYP_DTC p2, a.G071 p3, a.G072 p4, a.G073 p5, a.G011 p6, a.G032 p8, a.GD1 p10,
c."Kod_R" p15, d."Kod_Vip" p16, b."Kod_UVED" p19, f."Kod_UVED" p20
FROM GLAV a, REP c, VID_V d, TOVAR e, UVED b, UVED f
WHERE (d."Code"=a.GD0)AND( ((a.G072 BETWEEN d.DATBEG AND d.DATEND)AND(d.DATEND is not NULL))OR((d.DATEND is NULL)AND(a.G072>d.DATBEG)) )
AND (((a.G071=e.G071)AND(a.G072=e.G072)AND(a.G073=e.G073))AND( (c.KOD=SUBSTR(e.G37,1,2))AND(((c.DATEND is NULL)AND(a.G072>c.DATBEG))OR((a.G072 BETWEEN c.DATBEG AND c.DATEND)AND(c.DATEND is not NULL))) ))
AND ((a.G022=b.ZAYV) AND (a.G082=f.ZAYV));


Нужно вставить все записи из GLAV, причем код из VID_V(Kod_Vip) взять по Code, код из REP(Kod_R) взять по первым двум символам из TOVAR.G37 в ней ищу
нужную запись по связке GLAV.G071, GLAV.G072, GLAV.G073 для GLAV она уникальна а в TOVAR их несколько несколько(сколько товаров в накладной) причем и в
REP и в VID_V нужны записи только того временного интервала в кот входит GLAV.G072, и соответственно нужны коды контрагентов отправителя и получателя
(они из одной таблицы).
вообщем запросец тот еще
13 май 08, 11:18    [5654491]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
все умывают руки? неужели это не поддается оптимизиции? а точнее наверное переделыванию нужен какой то другой метод подход к этому! я уже всю голову сломал я не большой знаток sql поэтому я в тупике!
помогите чем можете...
13 май 08, 14:53    [5656265]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
kasik
все умывают руки?
Всем влом смотреть кучу неформатированного кода, а потом кучу уже по-иному неформатированного текста :)
13 май 08, 14:58    [5656312]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
Jannny
kasik
все умывают руки?
Всем влом смотреть кучу неформатированного кода, а потом кучу уже по-иному неформатированного текста :)

Так лучше:

Create table my_tabl (
"Kod" Number NOT NULL ,
"KOD_RAB" Number NOT NULL ,
"KOD_RAB_VIDAN" Number,
"Kod_R" Number NOT NULL ,
"Kod_Vip" Number NOT NULL ,
"Kod_UVED_OTP" Number NOT NULL ,
"Kod_UVED_POL" Number NOT NULL ,
"KOD_DOC" Number NOT NULL ,
"VID_KTC" Char (1),
"TYP_DTC" Char (1),
"G071" Varchar2 (8) NOT NULL ,
"G072" Date,
"G073" Char (7),
"G011" Char (2),
"G032" Number(5,0),
"GD1" Date,
"ETAG" Number,
"STILAJ" Number,
"POLKA" Number,
"TOM" Number,
"Primech" Varchar2 (20),
primary key ("Kod") 
) 

Create table GLAV (
"VID_KTC" Char (1),
"TYP_DTC" Char (1),
"G071" Varchar2 (8) NOT NULL ,
"G072" Date,
"G073" Char (7),
"G011" Char (2),
"G032" Number(5,0),
"GD1" Date,
"G022" Char (80),
"G082" Char (80),
"GD0" Char (2)
) 

Create table "UVED" ( --контрагенты
"Kod_UVED" Number NOT NULL ,
"INN" Varchar2 (12),
"ZAYV" Varchar2 (80),
"TELEFON" Varchar2 (12),
"SCHET1" Varchar2 (20),
"KORSCHR" Varchar2 (20),
"OKPOBV" Varchar2 (10),
"SCHET2" Varchar2 (20),
"DATR" Date,
"KPP" Varchar2 (9),
"DATN" Date,
"DATM" Date,
"SUBCNTRY" Varchar2 (35),
"CITY" Varchar2 (35),
"STREET" Varchar2 (35)
primary key ("Kod_UVED") 
) 

Create table REP (
"Kod_R" Number NOT NULL ,
"KOD" Varchar2 (2),
"NAIM" Varchar2 (250),
"DATBEG" Date,
"DATEND" Date
primary key ("Kod_R") 
) 
/

Create table VID_V (
"Kod_Vip" Number NOT NULL ,
"Code" Varchar2 (2),
"Name" Varchar2 (250),
"DATBEG" Date,
"DATEND" Date
primary key ("Kod_Vip") 
) 

Create table TOVAR (
"G071" Varchar2 (8),
"G072" Date,
"G073" Char (7),
"G037" Char (80)
) 


INSERT ALL
INTO my_tabl
VALUES( SQ_MY.nextval, DECODE(p3, '10', 1,
                                         '20', 2,
                                         '30', 3,
                                         '40', 4, NULL),
             p15, p16, p19, p20, 1, p1, p2, p3, p4, p5, p6, p8, p10 )
SELECT a.VID_KTC p1, a.TYP_DTC p2, a.G071 p3, a.G072 p4, a.G073 p5, a.G011 p6, a.G032 p8, 
a.GD1 p10, c."Kod_R" p15, d."Kod_Vip" p16, b."Kod_UVED" p19, f."Kod_UVED" p20
FROM GLAV a, REP c, VID_V d, TOVAR e, UVED b, UVED f
WHERE (d."Code"=a.GD0)AND( ((a.G072 BETWEEN d.DATBEG AND d.DATEND)
                                 AND(d.DATEND is not NULL))OR((d.DATEND is NULL)
                                 AND(a.G072>d.DATBEG)) )
AND (((a.G071=e.G071)AND(a.G072=e.G072)AND(a.G073=e.G073))
AND( (c.KOD=SUBSTR(e.G37,1,2))AND(((c.DATEND is NULL)AND(a.G072>c.DATBEG))
  OR((a.G072 BETWEEN c.DATBEG AND c.DATEND)AND(c.DATEND is not NULL))) ))
AND ((a.G022=b.ZAYV) AND (a.G082=f.ZAYV));
13 май 08, 15:09    [5656405]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Для начала непонятно, зачем Вам в принципе сводная таблица? И чем Вам не понравился вариант с view или mat.view. Оно по-Вашему описанию просто напрашивается.
Ну а во-вторых, зачем Вам тут insert all?? Здесь просто insert select.
13 май 08, 15:14    [5656443]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
Jannny
Для начала непонятно, зачем Вам в принципе сводная таблица? И чем Вам не понравился вариант с view или mat.view. Оно по-Вашему описанию просто напрашивается.
Ну а во-вторых, зачем Вам тут insert all?? Здесь просто insert select.


Под сводной таблицей вы понимаете my_tabl? в нее сливаются все основные данные!!!
а инсерт алл для мульти вставки! или я неправильно понял этого у меня вставка то одна ведь получается но из многих источников...
еще одно но - GLAV, TOVAR это таблицы дбф через гетерогенный сервис! можно ли через них сделать вьюшки! и по поводу вьюшек:
у меня 4 основных условия
1 -
d."Code"=a.GD0)AND( ((a.G072 BETWEEN d.DATBEG AND d.DATEND)
                                 AND(d.DATEND is not NULL))OR((d.DATEND is NULL)
                                 AND(a.G072>d.DATBEG)) )
по нему я получаю d."Kod_Vip"
2 -
(((a.G071=e.G071)AND(a.G072=e.G072)AND(a.G073=e.G073))
AND( (c.KOD=SUBSTR(e.G37,1,2))AND(((c.DATEND is NULL)AND(a.G072>c.DATBEG))
  OR((a.G072 BETWEEN c.DATBEG AND c.DATEND)AND(c.DATEND is not NULL))) ))
по нему я получаю c."Kod_R"
3 -
((a.G022=b.ZAYV)
код отправителя
4 -
(a.G082=f.ZAYV)
код получателя

и по каждому из них сделать вьюху и из нее вставлять?
13 май 08, 15:24    [5656527]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
kasik
Jannny
Для начала непонятно, зачем Вам в принципе сводная таблица? И чем Вам не понравился вариант с view или mat.view. Оно по-Вашему описанию просто напрашивается.
Ну а во-вторых, зачем Вам тут insert all?? Здесь просто insert select.
Под сводной таблицей вы понимаете my_tabl? в нее сливаются все основные данные!!!
а инсерт алл для мульти вставки! или я неправильно понял этого у меня вставка то одна ведь получается но из многих источников...
Вы столько над этим сидите и так ничего и не почитали...

Зачем Вам физически создавать сводную таблицу? Вы можете создать вьюху(ту или иную) на свой подзапрос из многих таблиц и обращаться к нему. Соответственно не синхронизировать ничего вручную.

А что касается insert all - он не для того, чтобы из многих таблиц сливать в одну, а для того, тобы одновременно писать в несколько таблиц.
13 май 08, 15:30    [5656589]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
Jannny
kasik
Jannny
Для начала непонятно, зачем Вам в принципе сводная таблица? И чем Вам не понравился вариант с view или mat.view. Оно по-Вашему описанию просто напрашивается.
Ну а во-вторых, зачем Вам тут insert all?? Здесь просто insert select.
Под сводной таблицей вы понимаете my_tabl? в нее сливаются все основные данные!!!
а инсерт алл для мульти вставки! или я неправильно понял этого у меня вставка то одна ведь получается но из многих источников...
Вы столько над этим сидите и так ничего и не почитали...

Зачем Вам физически создавать сводную таблицу? Вы можете создать вьюху(ту или иную) на свой подзапрос из многих таблиц и обращаться к нему. Соответственно не синхронизировать ничего вручную.

А что касается insert all - он не для того, чтобы из многих таблиц сливать в одну, а для того, тобы одновременно писать в несколько таблиц.


По поводу мультитэйбл я так и понял но позднее когда уже наворочел эту констркукцию но вижу что она не рабочая для данной ситуации!
а данные надо принять из дбфакв оракловую таблицу что бы я работал в дальнейшем с физич таблицей!
дак значит обычным ИНСЕРТОМ пользоваться?
13 май 08, 15:35    [5656636]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
сам принцип то какой будет? не выйдет ли такогоже награмождения где мне использовать мои 4 основных условия!? во вьюхах?
13 май 08, 15:37    [5656660]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
kasik
Member

Откуда:
Сообщений: 2142
Не ужели нет никакиой "стандартной" схемы(алгоритма поведения) в такой стандартной для базы данных ситуации:по наименованию из одной таблицы найти код его в другой и вставить его(код) в третью! даже на фокспро я знаю как это сделать! а на оракле это должно быть еще более проще и локоничней! чето на вьюшку не совсем похоже! и почему все молчат не ужели я спрашиваю чего то уж совсем неведанное для ораклоидов....
13 май 08, 18:45    [5657982]     Ответить | Цитировать Сообщить модератору
 Re: Вставка данных из одной таблицы в две(новичок)!  [new]
Jannny
Member

Откуда: Спб
Сообщений: 6424
Естественно записать из таблиц в другую несложно и ответ уже был - insert select. Вот только мне лично не кажется, что это удачное решение. В смысле - концепция. Давайте Вы с нуля расскажете, что Вы хотите добиться. Пока непонятно, - Вы хотите вести таблицу и в dbf, и в Oracle, а потом постоянно их синхронизировать? Как-то нетривиально, да и не просто. Изменяться данные будут и там, и там?
14 май 08, 10:03    [5659414]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить