驚くほど簡単な技術系健忘録

驚くほど簡単な技術系健忘録

アプリやWebサービス、RPAを作る上での健忘録を書いていきます。

一時テーブルとサブクエリの違いがわからない

メモリが云々とか色々と話しがあるけど正直違いが全くわからない。

ただコードを見る感じでは一時テーブル作るほうが個人的には好きということはわかった。

あと自分のスキルが低くそういう状況に陥ることがあまりないからだろうが、あるデータを解析したりする立場の人は下のように完全にテーブルを一からデータ型を指定してデータを入れるということはあまりないなーと思った。

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

www.postgresql.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
;


ただし、根本的な考え方は違わなさそうなのでちょっと使って覚えたいと思う。