Выберите строки с повторяющимися значениями в 2 столбцах - PullRequest
2 голосов
/ 22 февраля 2012

Это моя таблица:

CREATE TABLE [Test].[dbo].[MyTest]
(
[Id]    BIGINT NOT NULL,
[FId]   BIGINT NOT NULL,
[SId]   BIGINT NOT NULL
);

И некоторые данные:

INSERT INTO  [Test].[dbo].[MyTest] ([Id], [FId], [SId]) VALUES (1, 100, 11); 
INSERT INTO  [Test].[dbo].[MyTest] ([Id], [FId], [SId]) VALUES (2, 200, 12); 
INSERT INTO  [Test].[dbo].[MyTest] ([Id], [FId], [SId]) VALUES (3, 100, 21); 
INSERT INTO  [Test].[dbo].[MyTest] ([Id], [FId], [SId]) VALUES (4, 200, 22);
INSERT INTO  [Test].[dbo].[MyTest] ([Id], [FId], [SId]) VALUES (5, 300, 13); 
INSERT INTO  [Test].[dbo].[MyTest] ([Id], [FId], [SId]) VALUES (6, 200, 12); 

Так что мне нужно 2 запроса на выборку,

Первый выбор FId, SId, которые какв обоих столбцах различается, поэтому результат:

100, 11
200, 12
100, 21
200, 22
300, 13

Как видите, значения 200, 12 возвращаются один раз.

Второй запрос - это идентификаторы тех столбцов, которые дублируются в обоих FIdИтак, результат:

2
6

Кто-нибудь имеет какое-либо представление об этом?

Ответы [ 4 ]

9 голосов
/ 22 февраля 2012

Стандартный SQL

SELECT
    M.ID
FROM
    ( -- note all duplicate FID, SID pairs
    SELECT FID, SID
    FROM MyTable
    GROUP BY FID, SID
    HAVING COUNT(*) > 1
    ) T
    JOIN -- back onto main table using these duplicate FID, SID pairs
    MyTable M ON T.FID = M.FID AND T.SID = M.SID

Использование окон:

SELECT 
    T.ID
FROM
    (
    SELECT
        ID,
        COUNT(*) OVER (PARTITION BY FID, SID) AS CountPerPair
    FROM
        MyTable
    ) T
WHERE
   T.CountPerPair > 1
4 голосов
/ 22 февраля 2012

Первый запрос:

SELECT DISTINCT Fid,SId 
FROM MyTest

Второй запрос:

SELECT DISTINCT a1.Id
FROM MyTest a1 INNER JOIN MyTest a2
    ON a1.Fid = a2.Fid 
   AND a1.SId = a2.SId
   AND a1.Id <> a2.Id

Я не могу их проверить, но я думаю, что они должны работать ...

1 голос
/ 22 февраля 2012

первый:

select distinct FId,SId from [Test].[dbo].[MyTest]

второй запрос

select distinct t.Id
from [Test].[dbo].[MyTest] t
inner join [Test].[dbo].[MyTest] t2
on t.Id<>t2.Id and t.FId=t2.FId and t.SId=t2.SId
0 голосов
/ 22 февраля 2012

Часть 1 отличается от указанных выше.

Это разрешит вторую часть.

select id from [Test].[dbo].[MyTest] a 
where exists(select 1 from [Test].[dbo].[MyTest] where a.[SId] = [SId] and a.[FId] = [FId] and a.id <> id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...