Вставить данные из нескольких не объединяемых таблиц - PullRequest
2 голосов
/ 19 апреля 2011

У меня есть 3 таблицы в Oracle 9i дБ.A соединяется с B, а B соединяется с C. A & C нечего присоединиться.Я пытаюсь вставить строки в B со значениями из A & C. Я начал с этого:

INSERT INTO b
(value1, 
value2, 
value3, 
value4)
(SELECT 
a.value1,
a.value2,
c.value3, 
c.value4
FROM a, c 
WHERE a.column1 = x  
AND c.column2 = y)

Но так как между таблицами a & c нет соединения, я получаювставлено больше строк, чем я ожидаю.Есть ли способ разделить два оператора select, чтобы получить некоторые значения из таблицы и другие значения из критериев c?Если так, то каков синтаксис?

1 Ответ

1 голос
/ 19 апреля 2011

Поскольку между A и C нет никакой связи, объединение в основном будет декартовым.

Любые добавленные вами условия будут соответствовать вашим требованиям. Если вы сможете опубликовать некоторые данные из своих таблиц, это поможет понять ваш случай.

Допустим, у вас есть 2 таблицы учеников (с 10 строками) и классов (3 ряда), и теперь вы хотите вставить строки в третью таблицу (student_class_enrol). Если у вас нет особых условий, основная вставка будет ...

insert into student_class_enrol (student_id, class_id)
select s.student_id, c.class_id
  from students s, classes c;

, который вставит 30 строк для каждого ученика во всех 3 классах.

Чтобы избежать этой декартовой "ситуации", вы можете добавить условия непосредственно после запроса, как вы делали в своем вопросе ...

insert into student_class_enrol (student_id, class_id)
    select s.student_id, c.class_id
      from students s, classes c
      where (s.student_id not in (1,2,3) and c.class_id <> 4) ;

или добавьте условия отдельно, а затем выполните объединение.

insert into student_class_enrol (student_id, class_id)
    select s.student_id, c.class_id
      from (select student_id from students where student_id not in (1,2,3)) s
           (select class_id from class where class_id <> 4) c;
...