Kopiowanie rekordow bez wszystkich kolumn.

0

Czesc, problem jest taki:
Zalozmy ze mam tabele ,ktora zawiera nastepujace kolumny:
primarykey,nazwa,info1,info2 i teraz mam w niej takie wpisy
1.A a,a,
2. A b, b,
3. A c , c,

i teraz chcialbym skopiowac te wszystkie rekordy zeby dostac cos takiego np
4 B a, a,
5 B b,b,
6 B c,c,

czyli innymi slowy dostac ta sama zawartosc kolumn info1 i info2 ale moc zmienic primarykey i nazwa. Oczywiscie chce miec w bazie rekordy 1-6, a wiec metoda update odpada bo nadpisze mi to co jest w 1-3, a chce miec to i to. Jak to rozwiazac?Czy musze na przyklad tworzy dodatkowa tabele przechowujaca tylko tymczasowo dane?

Z gory dzieki za wszystkie sugestie!

0

Ok, czyli jak rozumiem bede musial sobie stworzyc dodatkowa tabele do przechowywania tych tymczasowych danych. Dzieki za odpowiedz!

0

A jest tak napisane w tym co wysłałem? :D

0

No tak , w obu linkach jest opis jak skopiowac cos z jednej tabeli do drugiej, chyba ze mam problem z czytaniem ze zrozumieniem

0

nie możesz dać po prostu insert into i do tej samej tabelki? :P Wydaje mi się, że możesz, jeśli się mylę niech mnie ktoś poprawi :)

0

jeśli ID masz autoinc to wystarczy INSERT INTO tab(nazwa, info1, info2) SELECT 'B', info1, info2 from tab

0

Z kolei jeśli nie ma autoinc, zawsze można dać:

INSERT INTO tab(id,nazwa,info1,info2) SELECT (select max(id)+1 from tab),'B',info1,info2 from tab
0

wg mnie to się nie uda ponieważ max(id) + 1 wszędzie powstawia to samo id - taki select jest operacją atomową w tym sensie, że operatory agregujące są obliczane raz dla wszystkich rekordów. Jak już to lepiej użyć rowid

0

Nie wiem jak inne systemy, ale Firebird działa poprawnie:
Przed:

ID  A   B     C

1   A   B     C
2   A   BB    CC
3   A   BB    CCC
4   A   BBB   CCCC

Po wykonaniu:

INSERT INTO tab(id,a,b,c) SELECT (select max(id)+1 from tab),'B',b,c FROM tab where ID <= 4

mamy następujące dane:

ID   A    B    C

1    A    B    C
2    A    BB   CC
3    A    BB   CCC
4    A    BBB  CCCC
5    B    B    C
6    B    BB   CC
7    B    BB   CCC
8    B    BBB  CCCC

Co ciekawe jak nie damy na końcu klauzuli where ID <= 4 to serwer nam się zawiesi i będzie dodawał w nieskończoność rekordy, np. dla 20:

ID    A    B    C

1     A    B    C
2     A    BB   CC
3     A    BB   CCC
4     A    BBB  CCCC
5     B    B    C
6     B    BB   CC
7     B    BB   CCC
8     B    BBB  CCCC
9     B    B    C
10    B    BB   CC
11    B    BB   CCC
12    B    BBB  CCCC
13    B    B    C
14    B    BB   CC
15    B    BB   CCC
16    B    BBB  CCCC
17    B    B    C
18    B    BB   CC
19    B    BB   CCC
20    B    BBB  CCCC
21    B    B    C
22    B    BB   CC
23    B    BB   CCC
24    B    BBB  CCCC

Czyli jak widać za każdym razem wykonywany jest odczyt oraz skorelowany subselect.

0
CREATE TABLE test1 (id INTEGER, a VARCHAR2(10), b VARCHAR2(10));
INSERT INTO test1 VALUES(1, 'a', 'aa');
INSERT INTO test1 VALUES(2, 'b', 'bb');
INSERT INTO test1 VALUES(3, 'c', 'cc');
INSERT INTO test1 VALUES(4, 'd', 'dd');
INSERT INTO test1 VALUES(5, 'e', 'ee');
INSERT INTO test1 VALUES(6, 'f', 'ff');


INSERT INTO test1 SELECT (SELECT Max(id) + 1 FROM test1), a, b FROM test1;

SELECT * FROM test1;

SQLite, Oracle i Postgres wynik identyczny:

ID A B 
 1 a aa
 2 b bb
 3 c cc
 4 d dd
 5 e ee
 6 f ff
 7 a aa
 7 b bb
 7 c cc
 7 d dd
 7 e ee
 7 f ff

Dla zapytania

INSERT INTO test1 SELECT Max(id) + 1, a, b FROM test1;

SQLite wstawia tylko jeden rekord, Oracle i Postgres krzyczą, że brakuje group by

postgres napisał(a)

kolumna "test1.a" musi występować w klauzuli GROUP BY lub być użyta w funkcji agregującej

oracle napisał(a)

ORA-00937: to nie jest jednogrupowa funkcja grupowa

0

Czyli znowu wychodzi na to, że Firebird ma coś zrobione niestandardowo.... :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1