2011-04-18 2 views
2

У меня есть 3 таблицы в Oracle 9i db. A присоединяется к B, а B присоединяется к C. A & C не имеет ничего общего. Я пытаюсь вставить строки в B со значениями как с & 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) 

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

+0

Если в столбце col1 = x имеется только одна строка и только одна строка в c, где col2 = y, этот вход должен вводить только одну строку. Если x и y имеют несколько строк, вы должны вставлять строки x * y. Вы можете попробовать Select Distinct, но если значения 1-4 различны для любых строк, все равно будут кратные. – user662852

+0

И почему вы используете этот подразумеваемый синтаксис соединения? Очень плохая практика кодирования. – HLGEM

ответ

1

Поскольку нет связи между 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; 
+0

Основываясь на «получении гораздо большего количества строк ...» Я думаю, что вопрос заключается в том, как избежать декартового произведения. –

+0

Ryan- обновленный мой запрос выше. Благодаря! –

Смежные вопросы