SQL Server - OUTER 結合と INNER 結合を組み合わせる - サンプルコード
SQL Server では、OUTER 結合と INNER 結合を組み合わせて、より複雑なデータセットを取得することができます。
OUTER 結合は、結合条件を満たす行だけでなく、満たさない行も含めて結果セットに含めます。
INNER 結合は、結合条件を満たす行のみを結果セットに含めます。
組み合わせの例
全ての顧客と注文を表示
SELECT c.FirstName, c.LastName, o.OrderID, o.OrderDate
FROM Customers c
FULL OUTER JOIN Orders o ON c.CustomerID = o.CustomerID;
このクエリは、Customers
テーブルと Orders
テーブルを結合し、すべての顧客とその注文を表示します。
注文していない顧客を表示
SELECT c.FirstName, c.LastName
FROM Customers c
LEFT OUTER JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE o.OrderID IS NULL;
商品と注文詳細を表示
SELECT p.ProductName, od.Quantity, od.UnitPrice
FROM Products p
INNER JOIN OrderDetails od ON p.ProductID = od.ProductID;
注意事項
- OUTER 結合と INNER 結合を組み合わせる場合、結合条件を慎重に設定する必要があります。
- 複雑なクエリは、パフォーマンスに影響を与える可能性があります。
SELECT c.FirstName, c.LastName, o.OrderID, o.OrderDate
FROM Customers c
FULL OUTER JOIN Orders o ON c.CustomerID = o.CustomerID;
出力例
FirstName | LastName | OrderID | OrderDate
----------|----------|---------|---------
田中 | 山田 | 1 | 2023-01-01
佐藤 | 鈴木 | 2 | 2023-02-01
高橋 | 伊藤 | NULL | NULL
SELECT c.FirstName, c.LastName
FROM Customers c
LEFT OUTER JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE o.OrderID IS NULL;
FirstName | LastName
----------|----------
高橋 | 伊藤
SELECT p.ProductName, od.Quantity, od.UnitPrice
FROM Products p
INNER JOIN OrderDetails od ON p.ProductID = od.ProductID;
ProductName | Quantity | UnitPrice
----------|---------|---------
Tシャツ | 1 | 1000
ペン | 2 | 500
顧客と注文を結合し、注文合計金額を表示
SELECT c.FirstName, c.LastName, SUM(od.Quantity * od.UnitPrice) AS TotalAmount
FROM Customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID
INNER JOIN OrderDetails od ON o.OrderID = od.OrderID
GROUP BY c.CustomerID, c.FirstName, c.LastName;
FirstName | LastName | TotalAmount
----------|----------|---------
田中 | 山田 | 2500
佐藤 | 鈴木 | 3000
複数の結合条件を設定
SELECT c.FirstName, c.LastName, o.OrderID, o.OrderDate
FROM Customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID
AND o.OrderDate > '2023-01-01'
AND o.OrderDate < '2023-03-01';
FirstName | LastName | OrderID | OrderDate
----------|----------|---------|---------
田中 | 山田 | 2 | 2023-02-01
佐藤 | 鈴木 | 3 | 2023-02-15
- 上記はあくまでもサンプルコードです。必要に応じて修正してください。
- 結合条件は、結合したいテーブルのカラムに基づいて設定します。
- 結合の種類は、取得したいデータセットによって異なります。
SQL Server - OUTER 結合と INNER 結合を組み合わせる - 他の方法
SELECT c.FirstName, c.LastName,
CASE WHEN o.OrderID IS NULL THEN '注文なし'
ELSE o.OrderID
END AS OrderID
FROM Customers c
LEFT OUTER JOIN Orders o ON c.CustomerID = o.CustomerID;
FirstName | LastName | OrderID
----------|----------|---------
田中 | 山田 | 1
佐藤 | 鈴木 | 2
高橋 | 伊藤 | 注文なし
UNION を使用する
(SELECT c.FirstName, c.LastName, o.OrderID
FROM Customers c
INNER JOIN Orders o ON c.CustomerID = o.CustomerID)
UNION
(SELECT c.FirstName, c.LastName, NULL AS OrderID
FROM Customers c
LEFT OUTER JOIN Orders o ON c.CustomerID = o.CustomerID
WHERE o.OrderID IS NULL);
FirstName | LastName | OrderID
----------|----------|---------
田中 | 山田 | 1
佐藤 | 鈴木 | 2
高橋 | 伊藤 | NULL
サブクエリを使用する
SELECT c.FirstName, c.LastName, (
SELECT o.OrderID
FROM Orders o
WHERE o.CustomerID = c.CustomerID
) AS OrderID
FROM Customers c;
FirstName | LastName | OrderID
----------|----------|---------
田中 | 山田 | 1
佐藤 | 鈴木 | 2
高橋 | 伊藤 | NULL
方法の比較
方法 | 利点 | 欠点 |
---|---|---|
CASE 式 | シンプル | 複雑な結合条件には不向き |
UNION | 複数の結合条件を指定しやすい | 結果セットの順序が保証されない |
サブクエリ | 柔軟性が高い | 処理速度が遅くなる可能性がある |
- 上記はあくまでも他の方法です。状況に応じて最適な方法を選択してください。
- 複雑なクエリを作成する場合は、パフォーマンスを考慮する必要があります。
sql-server