一時テーブルとサブクエリの違いがわからない
メモリが云々とか色々と話しがあるけど正直違いが全くわからない。
ただコードを見る感じでは一時テーブル作るほうが個人的には好きということはわかった。
あと自分のスキルが低くそういう状況に陥ることがあまりないからだろうが、あるデータを解析したりする立場の人は下のように完全にテーブルを一からデータ型を指定してデータを入れるということはあまりないなーと思った。
CREATE TEMPORARY TABLE SalesSummary ( product_name VARCHAR(50) NOT NULL, total_sales DECIMAL(12,2) NOT NULL DEFAULT 0.00, avg_unit_price DECIMAL(7,2) NOT NULL DEFAULT 0.00, total_units_sold INT UNSIGNED NOT NULL DEFAULT 0 ); INSERT INTO SalesSummary (product_name, total_sales, avg_unit_price, total_units_sold) VALUES ('cucumber', 100.25, 90, 2);
一時テーブルの削除はこれでできる
DROP TABLE SalesSummary;
実際によくある状況は膨大なテーブルを一旦集約してそれを一時テーブルに入れて既存のテーブルとつなげるという形なので以下のようなコードが多いと思う。
イメージとしてはFIFAランク1位の国のメンバーを出す感じ。
CREATE TEMPORARY TABLE C AS SELECT * FROM countries WHERE ranking=1; SELECT P.name FROM players AS P INNER JOIN C ON C.id=P.country_id;
つまりは
CREATE TEMPORARY TABLE tmp_t1 as SELECT * FROM t1;
以下は参考サイト
gihyo.jp
最近使っているVerticaも一時テーブルを作ったときにどう扱うかなどで書き方が少し違って以下の様な感じ。
SELECT CAST(COST as INT) * 2 as COST_APPLE into local temporary table APPLE on commit preserve rows FROM TEST WHERE NAME = 'りんご' ; SELECT CAST(COST as INT) * 3 as COST_TOMATO into local temporary table TOMATO on commit preserve rows FROM TEST WHERE NAME = 'トマト' ; SELECT SUM(COST) as COST FROM ( SELECT COST_APPLE as COST FROM APPLE UNION ALL SELECT COST_TOMATO as COST FROM TOMATO ) AS T1 ;
ただし、根本的な考え方は違わなさそうなのでちょっと使って覚えたいと思う。