InfiniDBは、MySQLをベースに動作していますが、VIEWのFROM句に対しての副問合せ指定は、MySQLの制限で出来ません。
副問合せ指定の場合 実行例
FROM句に副問合せを指定すると、ERROR 1349 が発生します。
1 2 3 4 5 6 7 |
mysql> CREATE VIEW v_test -> AS -> SELECT -> * -> FROM -> (select * from t1_test inner join t2_test on t1_test.col1 = t2_test.col1); ERROR 1349 (HY000): View's SELECT contains a subquery in the FROM clause |
FROM句の副問合せをVIEW化するか、実表化することで、同様の結果を取得することできます。
VIEW指定の場合 実行例
1. 副問合せをVIEWにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql> CREATE VIEW v1_test -> AS -> select -> t1.col1 as c1, -> t1.col2 as c2, -> t2.col1 as c3, -> t2.col2 as c4 -> from -> t1_test t1 -> inner join -> t2_test t2 -> on -> t1.col1 = t2.col1; Query OK, 0 rows affected (0.00 sec) |
2. 作成したVIEWをFROM句に指定します。
1 2 3 4 5 6 7 |
mysql> CREATE VIEW v2_test -> AS -> select -> * -> from -> v1_test; Query OK, 0 rows affected (0.00 sec) |
実表指定の場合 実行例
1. テーブルを新たに作成します。
1 2 3 4 5 6 7 |
mysql> CREATE TABLE `t3_test` ( -> `c1` varchar(10) DEFAULT NULL, -> `c2` varchar(10) DEFAULT NULL, -> `c3` varchar(10) DEFAULT NULL, -> `c4` varchar(10) DEFAULT NULL -> ) ENGINE=InfiniDB DEFAULT CHARSET=utf8; Query OK, 0 rows affected (2.31 sec) |
2. 作成したテーブルに副問合せの結果をコピーします。
1 |
# idbmysql -q -e 'select * from t1_test inner join t2_test on t1_test.col1 = t2_test.col1;' -N testdb | /usr/local/Calpont/bin/cpimport testdb t3_test -s '\t' -n1 |
3. 作成したテーブルにデータが、コピーされたことを確認します。
1 2 3 4 5 6 7 |
mysql> select * from t3_test; +------+------+------+--------+ | c1 | c2 | c3 | c4 | +------+------+------+--------+ | 1 | a | 1 | TEST_A | +------+------+------+--------+ 1 row in set (0.06 sec) |
4.作成したテーブルをVIEWのFROM句に指定します。
1 2 3 4 5 6 7 |
mysql> CREATE VIEW v_test -> AS -> SELECT -> * -> FROM -> t3_test; Query OK, 0 rows affected (0.00 sec) |
参考
VIEWの制限事項については、MySQLのマニュアルもご参照ください。http://dev.mysql.com/doc/refman/5.1/ja/create-view.html
また、バルクロードおよびVIEWの参考情報につて以下の記事もご確認下さい。
表から選択した内容をバルク挿入する方法
INSERT…SELECT処理を高速化する方法
VIEWでエクステントマップを活用する方法