1つのテーブルだけのデータを取得するには - - SqlFiddle Demo
複雑ではあるが許容できる解決策を作成しました。しかし、改善が必要です。
これは、複雑なコーディングを伴う複雑な手順であり、特に、すべての列のすべての行を単一の結果にフェッチgroup_concat
し、複雑な連結でフォーマットするクエリです。
シンプルで効率的で、すべてのシナリオで機能する必要があります。
私の解決策の詳細:以下は重要な部分であり、その他は単なる条件/ループです(私はドキュメントに不慣れで、時間と提案が必要です。誰かがフォーマットと改善を手伝ってくれるかもしれません。ご不便をおかけして申し訳ありませんが、あなたと私からの助けを喜んでください)
注: group_concat(yourColumn separator ' --anySeparator-- ') は、行が --anySeparator-- で区切られるように、列のすべての行を 1 つにマージしています。
select group_concat(column_name separator '`,`') into @cns1 from
information_schema.columns where table_schema=dn and table_name=@tn;
1 : column_names は、で区切られた単一の値として取得されます。
`,` => @cs1 = id`,`ename`,`did
select group_concat(column_name separator '`,"\',\'",`') into @cns2
from information_schema.columns where table_schema=dn and table_name=@tn;
2 : column_names は、で区切られた単一の値として取得されます。
`','` => @cn2 = id`','`ename`','`did
set @cns1=concat("`",@cns1,"`"); set @cns2=concat("`",@cns2,"`");
3: 列名の先頭と末尾に抜け文字 (`) を入れる
set @res=concat(@res," insert into ",@tn,"(",@cns1,") values ('");
4: 単にres= " insert into emp(
`id` ,
`ename` ,
`did`を作成) values("
します ここで、なぜセパレーターを配置したかがわかります (MySql フォーマットが達成されます)
set @temp := '';
set @q := concat("select group_concat(concat(",@cns2,") separator \"'),('\")
from ",dn,".",@tn, " into @temp");
上記は最も重要なステートメントです。テーブルからすべてのデータ行を単一の列の行として取得し、さらにこれらの行をマージして、'),('
5.1concat(",@cns2,")
は、すべての列の値を 1 つの列にまとめて取得します。
5.2 最も外側の concat の後、@q は
@q = "select group_concat(`id`','`ename`','`,did` separator '),(' from
mydb.emp into @temp";
5.3 : group_concat は、結合された列のすべての行を 1 つの値にマージします。列の値は @cns2 に存在するセパレーターを介して結合され、行レベルの結合は使用されます'),('
prepare s1 from @q;
execute s1;deallocate prepare s1;
set @res = concat(@res,@temp,");");
@q が実行されます
set @res = concat(@res,@temp,");");
6 : そして、次のような結果が得られます
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
そして、@res = concat(@res,@temp,");");
私たちが得た後
insert into emp(`id`,`ename`,`did`) values ('1','e1','4'),('2','e2','4'),
('3','e3','2'),('4','e4','4'),('5','e5','3);