LEFT JOINとIS NULLで結合されていないレコードを見つける
SQLで結合されていないレコードを見つけるには、いくつかの方法があります。
方法
EXISTS
キーワードを使用して、結合条件を満たさないレコードを見つけることができます。
SELECT *
FROM テーブル1
WHERE NOT EXISTS (
SELECT *
FROM テーブル2
WHERE テーブル1.ID = テーブル2.ID
);
この例では、テーブル1
に存在するが テーブル2
に存在しないレコードがすべて選択されます。
SELECT *
FROM テーブル1
LEFT JOIN テーブル2 ON テーブル1.ID = テーブル2.ID
WHERE テーブル2.ID IS NULL;
FULL OUTER JOIN
を使用して、両方のテーブルに存在しないレコードを見つけることができます。
SELECT *
FROM テーブル1
FULL OUTER JOIN テーブル2 ON テーブル1.ID = テーブル2.ID
WHERE テーブル1.ID IS NULL OR テーブル2.ID IS NULL;
集計関数を使用して、結合されていないレコードを見つけることもできます。
SELECT COUNT(*)
FROM テーブル1
WHERE NOT EXISTS (
SELECT *
FROM テーブル2
WHERE テーブル1.ID = テーブル2.ID
);
- どのテーブルのレコードを見つける必要があるか
- 結合条件
- 必要な結果
などを考慮する必要があります。
-- テーブル1
CREATE TABLE テーブル1 (
ID INT,
Name VARCHAR(255)
);
-- テーブル2
CREATE TABLE テーブル2 (
ID INT,
Address VARCHAR(255)
);
-- データ挿入
INSERT INTO テーブル1 (ID, Name) VALUES (1, 'John Doe');
INSERT INTO テーブル1 (ID, Name) VALUES (2, 'Jane Doe');
INSERT INTO テーブル2 (ID, Address) VALUES (1, '123 Main Street');
-- EXISTS キーワードを使用する
SELECT *
FROM テーブル1
WHERE NOT EXISTS (
SELECT *
FROM テーブル2
WHERE テーブル1.ID = テーブル2.ID
);
-- 結果
-- ID | Name
-- -- | --
-- 2 | Jane Doe
-- LEFT JOIN と IS NULL を使用する
SELECT *
FROM テーブル1
LEFT JOIN テーブル2 ON テーブル1.ID = テーブル2.ID
WHERE テーブル2.ID IS NULL;
-- 結果
-- ID | Name | ID | Address
-- -- | -- | -- | --
-- 2 | Jane Doe | NULL | NULL
-- FULL OUTER JOIN を使用する
SELECT *
FROM テーブル1
FULL OUTER JOIN テーブル2 ON テーブル1.ID = テーブル2.ID
WHERE テーブル1.ID IS NULL OR テーブル2.ID IS NULL;
-- 結果
-- ID | Name | ID | Address
-- -- | -- | -- | --
-- 2 | Jane Doe | NULL | NULL
-- NULL | NULL | 1 | 123 Main Street
-- 集計関数を使用する
SELECT COUNT(*)
FROM テーブル1
WHERE NOT EXISTS (
SELECT *
FROM テーブル2
WHERE テーブル1.ID = テーブル2.ID
);
-- 結果
-- count
-- --
-- 1
このサンプルコードを実行すると、結合されていないレコードを見つける方法を理解することができます。
注意
このサンプルコードは、PostgreSQL を使用しています。他のデータベースを使用する場合は、構文が異なる場合があります。
SQLで結合されていないレコードを見つけるその他の方法
SELECT *
FROM テーブル1
WHERE ID NOT IN (
SELECT ID
FROM テーブル2
);
SELECT *
FROM テーブル1
WHERE CASE WHEN EXISTS (
SELECT *
FROM テーブル2
WHERE テーブル1.ID = テーブル2.ID
) THEN '結合済み' ELSE '未結合' END = '未結合';
SELECT *
FROM テーブル1
WHERE EXISTS (
SELECT *
FROM (
SELECT *
FROM テーブル2
WHERE テーブル1.ID = テーブル2.ID
) AS t
WHERE t.ID IS NULL
);
以下のサンプルコードは、テーブル1
と テーブル2
を使用して、結合されていないレコードを見つける方法を示しています。
-- テーブル1
CREATE TABLE テーブル1 (
ID INT,
Name VARCHAR(255)
);
-- テーブル2
CREATE TABLE テーブル2 (
ID INT,
Address VARCHAR(255)
);
-- データ挿入
INSERT INTO テーブル1 (ID, Name) VALUES (1, 'John Doe');
INSERT INTO テーブル1 (ID, Name) VALUES (2, 'Jane Doe');
INSERT INTO テーブル2 (ID, Address) VALUES (1, '123 Main Street');
-- NOT IN キーワードを使用する
SELECT *
FROM テーブル1
WHERE ID NOT IN (
SELECT ID
FROM テーブル2
);
-- 結果
-- ID | Name
-- -- | --
-- 2 | Jane Doe
-- CASE 式を使用する
SELECT *
FROM テーブル1
WHERE CASE WHEN EXISTS (
SELECT *
FROM テーブル2
WHERE テーブル1.ID = テーブル2.ID
) THEN '結合済み' ELSE '未結合' END = '未結合';
-- 結果
-- ID | Name | 結合状態
-- -- | -- | --
-- 2 | Jane Doe | 未結合
-- 結合サブクエリを使用する
SELECT *
FROM テーブル1
WHERE EXISTS (
SELECT *
FROM (
SELECT *
FROM テーブル2
WHERE テーブル1.ID = テーブル2.ID
) AS t
WHERE t.ID IS NULL
);
-- 結果
-- ID | Name
-- -- | --
-- 2 | Jane Doe
sql select join