SQL Server: SELECT INTO 句と UNION [ALL] を使ってデータを結合する

2024-04-02

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


TRUNCATE TABLE vs. DELETE FROM: どちらが最適?

SQL Serverで大きなテーブルのデータをすべて削除するには、いくつかの方法があります。それぞれにメリットとデメリットがあり、状況によって最適な方法は異なります。方法TRUNCATE TABLETRUNCATE TABLE は、テーブルのすべてのデータを瞬時に削除する最も速い方法です。ただし、この方法はトランザクションログに記録されず、元に戻すことができないため、注意が必要です。...


MySQLテーブル作成エラー「Can't create table (errno: 150)」の全解決策

考えられる原因と解決策外部キー参照先の列が存在しない、またはデータ型が一致しない: 参照先のテーブルと列が存在し、かつデータ型が一致していることを確認してください。参照先の列がユニークでない: 参照先の列が主キーまたはUNIQUE制約で定義されていることを確認してください。...


SQL Server:DATETIME を操作する便利術 - 最寄りの分と時間に丸め

FLOOR および CEILING 関数を使用するFLOOR関数は、指定した値を 小数点以下を切り捨てた最大の整数 に丸めます。一方、CEILING関数は、指定した値を 小数点以下を切り上げた最大の整数 に丸めます。DATEADD および DATEPART 関数を使用する...


スキーマが存在するかどうかを確認:PostgreSQL で駆使する 4 つのテクニック

pg_namespace テーブルは、PostgreSQL の名前空間に関する情報を格納するシステムテーブルです。スキーマも名前空間の一種として扱われるため、このテーブルを利用してスキーマの存在を確認することができます。上記のクエリは、スキーマ名 が存在するかどうかを検査します。もしスキーマが存在すれば true を、存在しなければ false を返します。...


【初心者向け】SQL Server への接続でエラー 18456 が発生した時の解決方法

Microsoft SQL Serverへのログイン時にエラー18456が発生する場合があります。このエラーは、ログイン情報に問題があるか、データベースエンジンに問題があることを示します。原因:エラー18456の主な原因は以下の3つです。ログイン情報の誤り: ログイン名、パスワード、またはサーバー名の誤り 大文字と小文字の区別 特殊文字の使用...