2011-04-18 110 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

相關問題