SQL ServerでSELECT * INTO tempTable FROM CTEQueryの完全ガイド
SQLで一時テーブルをSELECT * INTO tempTable FROM CTEクエリで作成する方法
この解説では、SQL Serverで共通テーブル式(CTE)クエリから一時テーブルを作成する方法を紹介します。
一時テーブルは、データベースセッション中にのみ存在する仮想的なテーブルです。 データ分析や中間処理など、一時的なデータ保存に役立ちます。
共通テーブル式(CTE)とは
CTEは、複雑なクエリを複数の部分に分割して、読みやすく、再利用しやすいようにする機能です。
SELECT * INTO tempTable FROM CTEQuery
は、CTEクエリ結果を一時テーブルtempTable
に格納する構文です。
手順
- CTEクエリを作成する
WITH CTEQuery AS (
SELECT *
FROM YourTable
WHERE Condition
)
- SELECT * INTO tempTable FROM CTEQuery を実行
SELECT * INTO tempTable
FROM CTEQuery;
- 一時テーブルを使用
SELECT *
FROM tempTable;
例
WITH CTEQuery AS (
SELECT *
FROM Orders
WHERE OrderDate > '2023-12-31'
)
SELECT * INTO tempTable
FROM CTEQuery;
SELECT *
FROM tempTable;
注意点
- 一時テーブルは、セッションが終了すると自動的に削除されます。
- 一時テーブルは、他のセッションからは参照できません。
- 一時テーブルは、データベースのスキーマには含まれません。
WITH CTEQuery AS (
SELECT *
FROM Orders
WHERE OrderDate > '2023-12-31'
)
SELECT * INTO tempTable
FROM CTEQuery;
SELECT *
FROM tempTable;
例2:CTEクエリで集計結果を一時テーブルに格納
WITH CTEQuery AS (
SELECT OrderDate, COUNT(*) AS OrderCount
FROM Orders
GROUP BY OrderDate
)
SELECT * INTO tempTable
FROM CTEQuery;
SELECT *
FROM tempTable;
例3:JOIN結果を一時テーブルに格納
WITH CTEQuery AS (
SELECT o.OrderID, o.OrderDate, c.CustomerName
FROM Orders o
INNER JOIN Customers c ON o.CustomerID = c.CustomerID
)
SELECT * INTO tempTable
FROM CTEQuery;
SELECT *
FROM tempTable;
例4:一時テーブルをUPDATE
WITH CTEQuery AS (
SELECT *
FROM Orders
WHERE OrderDate > '2023-12-31'
)
SELECT * INTO tempTable
FROM CTEQuery;
UPDATE tempTable
SET OrderStatus = 'Shipped'
WHERE OrderID = 1;
SELECT *
FROM tempTable;
WITH CTEQuery AS (
SELECT *
FROM Orders
WHERE OrderDate > '2023-12-31'
)
SELECT * INTO tempTable
FROM CTEQuery;
DELETE FROM tempTable
WHERE OrderID = 1;
SELECT *
FROM tempTable;
WITH CTEQuery AS (
SELECT *
FROM Orders
WHERE OrderDate > '2023-12-31'
)
SELECT * INTO tempTable
FROM CTEQuery;
TRUNCATE TABLE tempTable;
SELECT *
FROM tempTable;
SQL ServerでCTEクエリから一時テーブルを作成する他の方法
CREATE TABLE と INSERT INTO を使用する
CREATE TABLE #tempTable (
-- 列定義
);
INSERT INTO #tempTable
(
-- 列名
)
SELECT
-- 列名
FROM CTEQuery;
-- 一時テーブルを使用
DROP TABLE #tempTable;
CREATE TABLE #tempTable (
OrderID INT,
OrderDate DATETIME,
CustomerName VARCHAR(50)
);
INSERT INTO #tempTable
(
OrderID,
OrderDate,
CustomerName
)
SELECT
OrderID,
OrderDate,
CustomerName
FROM Orders;
-- 一時テーブルを使用
DROP TABLE #tempTable;
SELECT INTO を使用する
SELECT * INTO #tempTable
FROM CTEQuery;
-- 一時テーブルを使用
DROP TABLE #tempTable;
SELECT * INTO #tempTable
FROM Orders;
-- 一時テーブルを使用
DROP TABLE #tempTable;
sp_executesql を使用する
EXEC sp_executesql
N'
WITH CTEQuery AS (
-- CTEクエリ
)
SELECT *
INTO #tempTable
FROM CTEQuery;
',
N'@param1 INT,
@param1 = 1;
-- 一時テーブルを使用
DROP TABLE #tempTable;
EXEC sp_executesql
N'
WITH CTEQuery AS (
SELECT *
FROM Orders
WHERE OrderDate > @param1
)
SELECT *
INTO #tempTable
FROM CTEQuery;
',
N'@param1 INT',
@param1 = '2023-12-31';
-- 一時テーブルを使用
DROP TABLE #tempTable;
sql sql-server common-table-expression