2011-04-18 71 views
2

我在Oracle 9i数据库中有3个表。 A加入B,B加入C. A & C没有什么可参加的。我试图从既有& C.值插入行的B I开始使用此:插入来自多个不可连接表的数据

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语句分开来从表中获取一些值,并从c标准中获取其他值?如果是这样,语法是什么?

+0

如果在col1 = x中只有一行,并且c中只有一行col2 = y,则该输入只能输入一行。如果x和y有多行,则会插入x * y行。您可以尝试Select Distinct,但如果值1-4对于任何行都不相同,则仍然会有倍数。 – user662852 2011-04-18 20:40:55

+0

为什么你使用这种隐含的连接语法?非常非常差的编码习惯。 – HLGEM 2011-04-18 21:53:10

回答

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

基于“获得更多的行......”我认为问题是如何避免笛卡尔积。 – 2011-04-18 21:20:11

+0

Ryan-更新了我上面的查询。谢谢! – 2011-04-18 21:25:45

相关问题