Aby uzyskać dane całej bazy danych - SqlFiddle Demo
Aby uzyskać dane tylko z jednej tabeli — — Demo SqlFiddle
Zrobiłem złożone, ale akceptowalne rozwiązanie. Ale wymaga poprawy .
Jest to złożona procedura ze złożonym kodowaniem, zwłaszcza zapytanie, które pobiera wszystkie wiersze wszystkich kolumn w jeden wynik przez group_concat
i formaty ze złożoną konkatenacją.
Potrzebujesz uproszczonego, wydajnego i działającego we wszystkich scenariuszach.
Niektóre szczegóły mojego rozwiązania :Ważna jest następująca część, inne to tylko warunki / Zapętlanie (nie jestem pod ręką z dokumentacją również potrzebuje czasu i sugestii, ktoś może mi pomóc w jej formatowaniu i ulepszeniu, przepraszam za wszelkie niedogodności, jednak chętnie za wszelką pomoc od ciebie i ode mnie)
Uwaga:group_concat(yourColumn separator ' --anySeparator-- ') łączy wszystkie wiersze kolumny w taki sposób, że wiersze są oddzielone --anySeparator--
select group_concat(column_name separator '`,`') into @cns1 from
information_schema.columns where table_schema=dn and [email protected];
1 :nazwy kolumn są pobierane jako pojedyncza wartość oddzielona
`,` => @cs1 = id`,`ename`,`did
select group_concat(column_name separator '`,"\',\'",`') into @cns2
from information_schema.columns where table_schema=dn and [email protected];
2 :nazwy kolumn są pobierane jako pojedyncza wartość oddzielona
`','` => @cn2 = id`','`ename`','`did
set @cns1=concat("`",@cns1,"`"); set @cns2=concat("`",@cns2,"`");
3:Brakująca litera (`) jest umieszczana na początku i na końcu nazw kolumn
set @res=concat(@res," insert into ",@tn,"(",@cns1,") values ('");
4:Po prostu wstawiasz res= " insert into emp(
`id` ,
`ename` ,
`did` ) values("
Tutaj możesz zobaczyć, dlaczego umieściłem separatory (osiągnięto formatowanie MySql)
set @temp := '';
set @q := concat("select group_concat(concat(",@cns2,") separator \"'),('\")
from ",dn,".",@tn, " into @temp");
Powyżej jest najważniejszym stwierdzeniem Pobiera wszystkie wiersze danych z tabeli jako wiersze pojedynczej kolumny, a następnie te wiersze są scalane i oddzielane przez '),('
5.1 concat(",@cns2,")
pobiera wartości wszystkich kolumn w jednej.
5.2 Po zewnętrznym konkacie teraz @q to
@q = "select group_concat(`id`','`ename`','`,did` separator '),(' from
mydb.emp into @temp";
5.3 :group_concat połączy wszystkie wiersze tej połączonej kolumny w jedną wartość. Wartości kolumn zostaną połączone za pomocą separatorów istniejących w @cns2, a łączenie na poziomie wierszy nastąpi za pomocą '),('
prepare s1 from @q;
execute s1;deallocate prepare s1;
set @res = concat(@res,@temp,");");
@q jest wykonywane
set @res = concat(@res,@temp,");");
6 :I otrzymamy wynik jako
res was = insert into emp(`id`,`ename`,`did`) values ('
@temp = 1','e1','4'),('2','e2','4'),
('3','e3','2'),('4','e4','4'),('5','e5','3
A po @res = concat(@res,@temp,");");
otrzymujemy
insert into emp(`id`,`ename`,`did`) values ('1','e1','4'),('2','e2','4'),
('3','e3','2'),('4','e4','4'),('5','e5','3);