SQL Serverで1つの列でSELECT DISTINCTを実行する方法
SQL Serverで1つの列でSELECT DISTINCTを実行する
1つの列で SELECT DISTINCT
を実行するには、列名を DISTINCT
キーワードの後に指定します。
SELECT DISTINCT column_name
FROM table_name;
例えば、Customers
テーブルに FirstName
列があるとします。この列の重複行を削除するには、次のようなクエリを実行します。
SELECT DISTINCT FirstName
FROM Customers;
このクエリは、Customers
テーブルの FirstName
列のすべての値を返しますが、重複行は削除されます。
例
SELECT DISTINCT FirstName, LastName
FROM Customers;
このクエリは、次の結果を返します。
FirstName | LastName
----------+----------
John | Doe
Jane | Doe
Bill | Smith
GROUP BY との比較
SELECT DISTINCT
は、GROUP BY
と似ていますが、異なる方法で動作します。
GROUP BY
は、行をグループ化し、グループごとに集計値を計算するために使用されます。
SELECT DISTINCT
は、重複行を削除するために使用されます。
SELECT DISTINCT
は、SELECT ステートメントの結果から重複行を削除するために使用されます。1つの列で SELECT DISTINCT
を実行するには、列名を DISTINCT
キーワードの後に指定します。
-- テーブル Customers
CREATE TABLE Customers (
FirstName varchar(50),
LastName varchar(50)
);
-- データ挿入
INSERT INTO Customers (FirstName, LastName) VALUES ('John', 'Doe');
INSERT INTO Customers (FirstName, LastName) VALUES ('Jane', 'Doe');
INSERT INTO Customers (FirstName, LastName) VALUES ('John', 'Smith');
INSERT INTO Customers (FirstName, LastName) VALUES ('Bill', 'Smith');
-- 1つの列でSELECT DISTINCT
SELECT DISTINCT FirstName
FROM Customers;
-- 結果
-- FirstName
-- ----------
-- John
-- Jane
-- Bill
-- 複数の列でSELECT DISTINCT
SELECT DISTINCT FirstName, LastName
FROM Customers;
-- 結果
-- FirstName | LastName
-- ----------+----------
-- John | Doe
-- Jane | Doe
-- John | Smith
-- Bill | Smith
このサンプルコードは、Customers
テーブルに4つの行を挿入し、FirstName
列と LastName
列の重複行を削除する方法を示します。
以下のサンプルコードは、SELECT DISTINCT
を使用して、さまざまな条件に基づいて重複行を削除する方法を示します。
-- 1つの列でSELECT DISTINCT、ORDER BY でソート
SELECT DISTINCT FirstName
FROM Customers
ORDER BY FirstName;
-- 複数の列でSELECT DISTINCT、WHERE で条件指定
SELECT DISTINCT FirstName, LastName
FROM Customers
WHERE FirstName = 'John';
-- サブクエリでSELECT DISTINCT
SELECT *
FROM (
SELECT DISTINCT FirstName, LastName
FROM Customers
) AS T;
SELECT DISTINCT 以外の重複行削除方法
GROUP BY
は、行をグループ化し、グループごとに集計値を計算するために使用されます。重複行を削除するには、GROUP BY
句でグループ化したい列を指定し、集計関数として COUNT(*)
を使用します。
SELECT column_name
FROM table_name
GROUP BY column_name
HAVING COUNT(*) = 1;
SELECT FirstName
FROM Customers
GROUP BY FirstName
HAVING COUNT(*) = 1;
CTE (Common Table Expressions)
CTE は、複雑なクエリをより小さく、読みやすい部分に分割するために使用できます。重複行を削除するには、CTE を使用して重複行を削除するサブクエリを作成し、それを外部クエリで参照できます。
WITH CTE AS (
SELECT column_name
FROM table_name
GROUP BY column_name
HAVING COUNT(*) = 1
)
SELECT *
FROM CTE;
WITH CTE AS (
SELECT FirstName
FROM Customers
GROUP BY FirstName
HAVING COUNT(*) = 1
)
SELECT *
FROM CTE;
DISTINCT
キーワードと ORDER BY
句を組み合わせることで、重複行を削除することもできます。
SELECT column_name
FROM table_name
ORDER BY column_name
DISTINCT ON (column_name);
SELECT FirstName
FROM Customers
ORDER BY FirstName
DISTINCT ON (FirstName);
- 少量のデータで単純なクエリを実行する場合、
SELECT DISTINCT
が最も簡単な方法です。 - 大量のデータで複雑なクエリを実行する場合、
GROUP BY
または CTE を使用した方がパフォーマンスが向上する可能性があります。 - 特定の順序で結果を取得したい場合は、
DISTINCT
キーワードとORDER BY
句を組み合わせる必要があります。
SELECT DISTINCT
は、SQL Server で重複行を削除する最も簡単な方法です。ただし、大量のデータで複雑なクエリを実行する場合、GROUP BY
または CTE を使用した方がパフォーマンスが向上する可能性があります。
sql-server t-sql