SQL Server: SELECT INTO 句と UNION [ALL] を使ってデータを結合する
SQL と SQL Server における SELECT INTO 句と UNION [ALL] の使用
SELECT INTO
句は、SELECT ステートメントの結果を新しいテーブルまたは既存のテーブルに挿入するために使用されます。 UNION
演算子は、複数の SELECT ステートメントの結果を結合するために使用されます。 ALL
キーワードは、重複する行を含めて結合結果を取得するために使用されます。
SELECT INTO
句と UNION [ALL]
を組み合わせることで、複数の SELECT ステートメントの結果を新しいテーブルまたは既存のテーブルに挿入することができます。
例
-- 新しいテーブルを作成する
SELECT *
INTO new_table
FROM table1
UNION
SELECT *
FROM table2;
-- 既存のテーブルに追加する
SELECT *
INTO table3
FROM table1
UNION ALL
SELECT *
FROM table2;
注意事項
- すべての SELECT ステートメントは、同じ列数とデータ型を持つ必要があります。
UNION
は重複する行を削除しますが、UNION ALL
は重複する行を含めます。SELECT INTO
句は、INSERT INTO
ステートメントよりも効率的です。
補足
- 上記の例では、
*
を使用してすべての列を選択していますが、必要な列のみを選択することもできます。 WHERE
句などの条件を指定して、結果を絞り込むこともできます。ORDER BY
句を使用して、結果を並べ替えることもできます。
- SQL Server に関する情報は、Microsoft のドキュメントを参照してください。
-- テーブルの作成
CREATE TABLE dbo.Employees (
EmployeeID int NOT NULL,
FirstName varchar(50) NOT NULL,
LastName varchar(50) NOT NULL,
Department varchar(50) NOT NULL
);
-- データの挿入
INSERT INTO dbo.Employees (EmployeeID, FirstName, LastName, Department)
VALUES (1, 'John', 'Doe', 'Sales');
INSERT INTO dbo.Employees (EmployeeID, FirstName, LastName, Department)
VALUES (2, 'Jane', 'Doe', 'Marketing');
INSERT INTO dbo.Employees (EmployeeID, FirstName, LastName, Department)
VALUES (3, 'John', 'Smith', 'IT');
-- 新しいテーブルの作成
SELECT *
INTO dbo.NewEmployees
FROM dbo.Employees
WHERE Department = 'Sales'
UNION
SELECT *
FROM dbo.Employees
WHERE Department = 'Marketing';
-- 結果の確認
SELECT *
FROM dbo.NewEmployees;
結果
EmployeeID FirstName LastName Department
----------- -------- -------- --------
1 John Doe Sales
2 Jane Doe Marketing
例 2: 既存のテーブルに追加する
-- テーブルの作成
CREATE TABLE dbo.Departments (
DepartmentID int NOT NULL,
Name varchar(50) NOT NULL
);
-- データの挿入
INSERT INTO dbo.Departments (DepartmentID, Name)
VALUES (1, 'Sales');
INSERT INTO dbo.Departments (DepartmentID, Name)
VALUES (2, 'Marketing');
INSERT INTO dbo.Departments (DepartmentID, Name)
VALUES (3, 'IT');
-- 既存のテーブルに追加
SELECT DepartmentID, Name
INTO dbo.Departments
FROM dbo.Departments
WHERE DepartmentID IN (1, 2)
UNION ALL
SELECT DepartmentID, Name
FROM dbo.Departments
WHERE DepartmentID = 3;
-- 結果の確認
SELECT *
FROM dbo.Departments;
DepartmentID Name
----------- --------
1 Sales
2 Marketing
3 IT
説明
- 例 1 では、
SELECT INTO
句を使用して、dbo.Employees
テーブルからSales
部門とMarketing
部門の従業員のデータを新しいdbo.NewEmployees
テーブルに挿入しています。 - 例 2 では、
SELECT INTO
句を使用して、dbo.Departments
テーブルにIT
部門を追加しています。
- 上記の例はあくまでもサンプルです。実際の業務に合わせてコードを変更する必要があります。
SELECT INTO 句と UNION [ALL] を使用しない方法
-- 新しいテーブルを作成する
CREATE TABLE dbo.NewEmployees (
EmployeeID int NOT NULL,
FirstName varchar(50) NOT NULL,
LastName varchar(50) NOT NULL,
Department varchar(50) NOT NULL
);
-- データの挿入
INSERT INTO dbo.NewEmployees (EmployeeID, FirstName, LastName, Department)
SELECT EmployeeID, FirstName, LastName, Department
FROM dbo.Employees
WHERE Department = 'Sales';
INSERT INTO dbo.NewEmployees (EmployeeID, FirstName, LastName, Department)
SELECT EmployeeID, FirstName, LastName, Department
FROM dbo.Employees
WHERE Department = 'Marketing';
-- 既存のテーブルに追加
INSERT INTO dbo.Departments (DepartmentID, Name)
SELECT DepartmentID, Name
FROM dbo.Departments
WHERE DepartmentID IN (1, 2);
INSERT INTO dbo.Departments (DepartmentID, Name)
SELECT DepartmentID, Name
FROM dbo.Departments
WHERE DepartmentID = 3;
WITH ステートメントを使用する
-- 新しいテーブルを作成する
WITH cte AS (
SELECT *
FROM dbo.Employees
WHERE Department IN ('Sales', 'Marketing')
)
SELECT *
INTO dbo.NewEmployees
FROM cte;
-- 既存のテーブルに追加
WITH cte AS (
SELECT *
FROM dbo.Departments
WHERE DepartmentID IN (1, 2)
)
INSERT INTO dbo.Departments (DepartmentID, Name)
SELECT DepartmentID, Name
FROM cte;
WITH cte AS (
SELECT *
FROM dbo.Departments
WHERE DepartmentID = 3
)
INSERT INTO dbo.Departments (DepartmentID, Name)
SELECT DepartmentID, Name
FROM cte;
- 上記の例では、
INSERT INTO
ステートメントとWITH
ステートメントを使用して、SELECT INTO
句とUNION [ALL]
比較
方法 | メリット | デメリット |
---|---|---|
SELECT INTO 句 | 簡潔 | すべての SELECT ステートメントが同じ列数とデータ型を持つ必要がある |
INSERT INTO ステートメント | 柔軟性がある | 冗長になる可能性がある |
WITH ステートメント | 可読性が高い | 複雑になる可能性がある |
sql sql-server