のは、私のような人のidの(1-8)と、人の役割(1-4)のテーブルがあるとしましょう:SELECT重複/
CREATE TABLE personRole (
PersonId int NOT NULL,
RoleId int NOT NULL
);
INSERT INTO personRole
VALUES
(1, 1),
(1, 2),
(2, 1),
(2, 3),
(3, 3),
(4, 3),
(1, 4),
(5, 2),
(6, 1),
(7, 1),
(7, 4),
(8, 1),
(8, 2),
(8, 4)
;
私の目標3つの以上の役割や役割を持っている人IDを選択することで具体的には1、2であり、ここで4は私の最初のソリューションです:
SELECT PersonId FROM personRole
WHERE RoleID in (1,2,4)
GROUP BY PersonId
HAVING count(*) >= 3
しかし、私はそれので、GROUP BYせずにそれを行うように言われました私はこの解決策を思いついたので、遅いです:
SELECT distinct PersonId
FROM
(
SELECT PersonId, count(*) over(partition by PersonId) AS pcount
FROM (SELECT * FROM personRole WHERE RoleID in (1,2,4)) AS A
) AS S
WHERE pcount >= 3
私が達成しようとしていることの例を示すために、これらを含めました。 しかし、今私はカウントせずにそれを試みるように言われている。私は現在、このような2連/繰り返す人のIDを持つすべての行を見つけることができています:
SELECT personId
FROM personRole AS a
WHERE EXISTS (
SELECT 1
FROM personRole AS a2
WHERE a2.PersonId = a.PersonId
AND a2.RoleID <> a.RoleID
);
しかし、私は、彼らが3回以上繰り返した場合にのみ、それらを選択する方法を見つけようとして立ち往生しています。私が能力があれば、私はちょうどそれと交渉することができると思う:
私の完全な解決策を得るには。私はこれを正しく解決しているのか、間違った方向に行っていますか?
3を超えることはできません。元のクエリを再訪して、それがなぜ遅いのかを調べるべきだと思います。 – Strawberry