从多个不可连接的表中插入数据

时间:2011-04-18 20:32:17

标签: sql insert oracle9i

我在Oracle 9i db中有3个表。 A加入B,B加入C. A& C没有任何东西可以加入。我试图用A和A的值插入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)

但由于表格和表格之间没有联接。 c,我插入的行数比我预期的多得多。有没有办法将两个select语句拆分为从a表中获取某些值以及从c条件中获取其他值?如果是这样,语法是什么?

1 个答案:

答案 0 :(得分:1)

由于A和C之间没有关系,因此连接基本上是笛卡尔连接。

您添加的任何条件都将特定于您的要求。如果您可以从表中发布一些数据,那么理解您的案例会很有帮助。

假设你有两个表学生(有10行)和Classes(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;