を使用count(*) over(partition by...)
すると、影響を受けるすべての行とすべての必要な列をリストしながら、不要な繰り返しを見つけるためのシンプルで効率的な手段が提供されます。
SELECT
t.*
FROM (
SELECT
s.*
, COUNT(*) OVER (PARTITION BY s.name, s.city) AS qty
FROM stuff s
) t
WHERE t.qty > 1
ORDER BY t.name, t.city
最新のRDBMSバージョンはcount(*) over(partition by...)
MySQL V 8.0をサポートしていますが、以下に示すように「ウィンドウ関数」が導入されています(MySQL 8.0の場合)。
CREATE TABLE stuff(
id INTEGER NOT NULL
,name VARCHAR(60) NOT NULL
,city VARCHAR(60) NOT NULL
);
INSERT INTO stuff(id,name,city) VALUES
(904834,'jim','London')
, (904835,'jim','London')
, (90145,'Fred','Paris')
, (90132,'Fred','Paris')
, (90133,'Fred','Paris')
, (923457,'Barney','New York') # not expected in result
;
SELECT
t.*
FROM (
SELECT
s.*
, COUNT(*) OVER (PARTITION BY s.name, s.city) AS qty
FROM stuff s
) t
WHERE t.qty > 1
ORDER BY t.name, t.city
id | 名前| 市| 数量
-----:| :--- | :----- | -:
90145 | フレッド| パリ| 3
90132 | フレッド| パリ| 3
90133 | フレッド| パリ| 3
904834 | ジム| ロンドン| 2
904835 | ジム| ロンドン| 2
ここに db <> fiddle
ウィンドウ関数。 MySQLは、クエリの各行について、その行に関連する行を使用して計算を実行するウィンドウ関数をサポートするようになりました。これらには、RANK()、LAG()、NTILE()などの関数が含まれます。さらに、いくつかの既存の集約関数をウィンドウ関数として使用できるようになりました。たとえば、SUM()やAVG()などです。詳細については、12.21項「ウィンドウ関数」を参照してください。
name
またはcity
が含まれている場合null
、それらは外部クエリでは報告されませんが、内部クエリでは一致します。