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

Sql 从多个不可联接的表中插入数据,sql,insert,oracle9i,Sql,Insert,Oracle9i,我在Oracle 9i数据库中有3个表。A与B连接,B与C连接。A&C没有任何连接。我正在尝试使用A和C中的值将行插入到B中。我从以下内容开始: 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之间没有连接,因此插入的行比预

我在Oracle 9i数据库中有3个表。A与B连接,B与C连接。A&C没有任何连接。我正在尝试使用A和C中的值将行插入到B中。我从以下内容开始:

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

因为A和C之间没有关系,所以连接基本上是笛卡尔连接

您添加的任何条件都将根据您的要求而定。如果您可以从表中发布一些数据,这将有助于理解您的案例

假设您有两个表,学生有10行,班级有3行,现在您希望将行插入第三个表,学生注册。除非你有一些特定的条件,基本的插入将是

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;

如果a中只有一行,其中col1=x,而c中只有一行,其中col2=y,则此输入应仅输入一行。如果x和y有多行,则插入x*y行。您可以尝试选择Distinct,但如果任何行的值1-4不同,仍然会有倍数。为什么要使用隐含的联接语法?非常非常糟糕的编码实践。基于获得更多行。。。我认为问题在于如何避免笛卡尔积。