Sql 选择两列中具有重复值的行

Sql 选择两列中具有重复值的行,sql,sql-server-2008,tsql,Sql,Sql Server 2008,Tsql,这是我的桌子: 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],

这是我的桌子:

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,它们类似于一个distinct,因此结果为:

100, 11
200, 12
100, 21
200, 22
300, 13
2
6
正如您看到的
200的值一样,12
返回了一次

第二个查询是在FId和SId中重复的列的Id,因此结果为:

100, 11
200, 12
100, 21
200, 22
300, 13
2
6
有人知道吗?

第一个问题:

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
选择不同的a1.Id
从MyTest a1内部连接MyTest a2
关于a1.Fid=a2.Fid
a1.SId=a2.SId
和a1.Id a2.Id
我无法测试它们,但我认为它们应该工作…

首先:

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
选择不同的t.Id
来自[Test].[dbo].[MyTest]t
内部联接[Test].[dbo].[MyTest]t2
在t.Idt2.Id和t.FId=t2.FId和t.SId=t2.SId上
标准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

第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)
从[Test].[dbo].[MyTest]a中选择id
存在的位置(从[Test].[dbo].[MyTest]中选择1,其中[SId]=[SId]和[FId]=[FId]以及a.id id)

我认为在第二个查询中,您应该使用
DISTINCT
,因为如果重复的行多于两行,您会多次获得相同的id。我说的对吗?不,我的意思是:如果OP的id 2、6和8具有相同的FId和SId,那么不带
DISTINCT
的查询将每个id返回两次(因此2、2、6、6、8、8)。我无法测试它,但我非常确定……第二个查询中的DISTINCT增加了开销:它修复了一个糟糕的连接。这不会因此而扩大规模。它是一个简单的聚合和自连接+1,用于处理多个相同的行(3行或更多行),而不会飞溅/滥用distinct