2009-04-01 9 views
5

Tabeli T1 strukturę: Numer kol1, numer kolumna2SQL ładowarki: ładowania do 2 tabelach od 1 control i 1 CSV

Tabeli T2 Struktura: numer kol1, numer kolumna2, numer Col3

CSV:

row1:1,2,3,4,5,6 
row2:1,2,3,4,5,6 

że aby dane w tabeli T1 jak:

col1 col2 
===== ==== 
1  3 
1  3 

że aby dane w tabeli T2 jak:

col1 col2 col3 
===== ==== ==== 
1  3  5 
1  3  5 

plik po sterowania nie działa

load data 
infile * 
insert into table T1 fields terminated by ',' TRAILING NULLCOLS 
(col1,fill1 filler,col2) 
insert into table T2 fields terminated by ',' TRAILING NULLCOLS 
(col1,fill2 filler,col2,fill3 filler,col3) 
begindata 
1,2,3,4,5,6 
1,2,3,4,5,6 

Proszę mi pomóc rozwiązać ten problem.

+0

jaka wersja SQL jest to? dodaj tag, proszę –

+0

Proszę przyjąć odpowiedź, jeśli rozwiąże ona twój problem. Pomoże to innym ... –

Odpowiedz

0

Spróbuj tego:

LOAD DATA 
INFILE * 
INSERT INTO TABLE T1 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1, FILL2 FILLER, COL2, FILL4 FILLER, FILL5 FILLER, FILL6 FILLER) 
INSERT INTO TABLE T2 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1, FILL2 FILLER, COL2, FILL3 FILLER, COL3, FILL6 FILLER) 
BEGINDATA 
1,2,3,4,5,6 
1,2,3,4,5,6 
+0

Przepraszam, że nie działa –

+0

Co to jest napisane? – Quassnoi

+0

zobacz moją odpowiedź (poniżej i mam nadzieję, że wkrótce będzie powyżej). Wiele klauzul INTO wymaga zresetowania logicznego wskaźnika - w przeciwnym razie widzisz 4,5,6 do t2. Polecenie position() zresetuje wskaźnik. Zawsze łatwiej jest załadować dane pozycyjne do wielu tabel, właśnie z tego powodu. –

2

To nie praca, ale nie podoba mi się to rozwiązanie. W takich sytuacjach wolę korzystać z tabel zewnętrznych. Krótka odpowiedź brzmi, że masz problemy, ponieważ SQLLDR nie skanuje ponownie automatycznie danych w wielu wierszach importu. Poniżej znajduje się fragment z dokumentacji.

From the SQLLDR documentation

wykorzystanie pozycji z wielu tabel Ładunki

W wielokrotnego obciążenia tabeli, należy określić kilka klauzul tabeli do. Po określeniu pozycji POSITION () dla pierwszej kolumny pierwszej tabeli, pozycja jest obliczana względem początku rekordu logicznego. Po określeniu pozycji POSITION () dla pierwszej kolumny kolejnych tabel, pozycja jest obliczana względem ostatniej kolumny wczytanej ostatniej tabeli.

Tak więc po rozpoczęciu kolejnej klauzuli INTO TABLE pozycja nie jest automatycznie ustawiana na początku rekordu logicznego. Dzięki temu wiele klauzul INTO TABLE przetwarza różne części tego samego rekordu fizycznego. Na przykład zobacz Wydobywanie wielu rekordów logicznych.

Rekord logiczny może zawierać dane dla jednej z dwóch tabel, ale nie dla obu. W takim przypadku zresetujesz POSITION. Zamiast pomijać specyfikację pozycji lub używać POSITION (* + n) dla pierwszego pola w klauzuli INTO TABLE, użyj POSITION (1) lub POSITION (n).

load data 
    infile * 
    truncate 
    into table T1 
    fields terminated by ',' trailing nullcols 
    (col1 
    , fill1 filler 
    , col2 ) 
    into table T2 
    fields terminated by ',' trailing nullcols 
    (col1 position(1) 
    , filler filler 
    , col2  
    , filler2 filler 
    , col3) 

BEGINDATA 
1,2,3,4,5,6 
1,2,3,4,5,6 

SQL> select * From t1; 

     COL1  COL2 
---------- ---------- 
     1   3 
     1   3 

SQL> select* From t2; 

     COL1  COL2  COL3 
---------- ---------- ---------- 
     1   3   5 
     1   3   5 
+0

Dzięki Neil +1 za szczegółowy kod i specjalnie dla pozycji col1 (1) –

2

Spróbuj

LOAD DATA 
INFILE * "STR '|EndRec|'" 
INSERT INTO TABLE T1 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1, FILL2 FILLER, COL2, FILL4 FILLER, FILL5 FILLER, FILL6 FILLER) 
INSERT INTO TABLE T2 FIELDS TERMINATED BY ',' TRAILING NULLCOLS 
(COL1 POSITION(1), FILL2 FILLER, COL2, FILL3 FILLER, COL3, FILL6 FILLER) 

BEGINDATA 
1,2,3,4,5,6|EndRec|1,2,3,4,5,6|EndRec|