SQL Serverでテーブルから別のテーブルを引くその他の方法
SQL Serverでテーブルから別のテーブルを引く方法
EXCEPT キーワードを使う
EXCEPT
キーワードは、2つのテーブルの差集合を求める最も簡単な方法です。以下の例では、Customers
テーブルから Orders
テーブルを引いて、注文していない顧客のリストを取得しています。
SELECT *
FROM Customers
EXCEPT
SELECT CustomerID
FROM Orders;
このクエリは、Customers
テーブルにあるすべての列を返し、Orders
テーブルにある CustomerID
と一致する行を除外します。
注意: EXCEPT
キーワードは、両方のテーブルに同じ列名とデータ型が存在する必要があります。
NOT IN 演算子を使う
NOT IN
演算子は、あるテーブルの列が別のテーブルの列に存在しないかどうかをチェックするために使用できます。以下の例では、Orders
テーブルに存在しない CustomerID
を持つ顧客のリストを取得しています。
SELECT *
FROM Customers
WHERE CustomerID NOT IN (
SELECT CustomerID
FROM Orders
);
このクエリは、Customers
テーブルにあるすべての列を返し、Orders
テーブルの CustomerID
列に存在しない CustomerID
を持つ行のみを選択します。
注意: NOT IN
演算子は、EXCEPT
キーワードよりも柔軟ですが、パフォーマンスが劣る場合があります。
JOIN と WHERE 句を使う
JOIN
と WHERE
句を使って、2つのテーブルを結合し、差集合を求めることもできます。以下の例では、Customers
テーブルと Orders
テーブルを結合し、Orders
テーブルに存在しない CustomerID
を持つ顧客のリストを取得しています。
SELECT *
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE o.CustomerID IS NULL;
このクエリは、Customers
テーブルと Orders
テーブルを CustomerID
列で結合し、Orders
テーブルに存在しない CustomerID
を持つ Customers
テーブルの行のみを選択します。
注意: JOIN
と WHERE
句を使う方法は、最も複雑ですが、最も柔軟な方法です。
SQL Serverでテーブルから別のテーブルを引く方法はいくつかあります。どの方法を使うかは、状況によって異なります。
- 最も柔軟な方法:
JOIN
とWHERE
句を使う
-- テーブル Customers と Orders のスキーマ
CREATE TABLE Customers (
CustomerID INT,
FirstName VARCHAR(50),
LastName VARCHAR(50)
);
CREATE TABLE Orders (
OrderID INT,
CustomerID INT,
OrderDate DATE
);
-- サンプルデータ
INSERT INTO Customers (CustomerID, FirstName, LastName)
VALUES
(1, 'John', 'Doe'),
(2, 'Jane', 'Doe'),
(3, 'Peter', 'Smith');
INSERT INTO Orders (OrderID, CustomerID, OrderDate)
VALUES
(1, 1, '2023-01-01'),
(2, 2, '2023-02-01'),
(3, 3, '2023-03-01');
-- クエリ
SELECT *
FROM Customers
EXCEPT
SELECT CustomerID
FROM Orders;
-- 結果
-- CustomerID | FirstName | LastName
-- ---------- | -------- | --------
-- 2 | Jane | Doe
-- クエリ
SELECT *
FROM Customers
WHERE CustomerID NOT IN (
SELECT CustomerID
FROM Orders
);
-- 結果
-- CustomerID | FirstName | LastName
-- ---------- | -------- | --------
-- 2 | Jane | Doe
-- クエリ
SELECT *
FROM Customers c
LEFT JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE o.CustomerID IS NULL;
-- 結果
-- CustomerID | FirstName | LastName
-- ---------- | -------- | --------
-- 2 | Jane | Doe
サブクエリを使う
サブクエリを使って、2つのテーブルの差集合を求めることができます。以下の例では、Orders
テーブルに存在しない CustomerID
を持つ顧客のリストを取得しています。
SELECT *
FROM Customers
WHERE CustomerID NOT IN (
SELECT CustomerID
FROM Orders
);
CASE 式を使う
SELECT *
FROM Customers
WHERE CASE WHEN CustomerID IN (
SELECT CustomerID
FROM Orders
) THEN 'Has Order' ELSE 'No Order' END = 'No Order';
テンポラリーテーブルを使う
CREATE TABLE #TempOrders (
CustomerID INT
);
INSERT INTO #TempOrders (CustomerID)
SELECT CustomerID
FROM Orders;
SELECT *
FROM Customers
WHERE CustomerID NOT IN (
SELECT CustomerID
FROM #TempOrders
);
DROP TABLE #TempOrders;
sql sql-server difference