Sql 返回三列中数据相同的行

Sql 返回三列中数据相同的行,sql,sql-server,Sql,Sql Server,我有一个具有以下模式的表 CREATE TABLE [dbo].[personas]( [id_persona] [int] IDENTITY(1,1) NOT NULL, [nombres] [nvarchar](50) NOT NULL, [apellido_paterno] [nvarchar](50) NULL, [apellido_materno] [nvarchar](50) NULL, [fecha_nacimiento] [date] NO

我有一个具有以下模式的表

CREATE TABLE [dbo].[personas](
    [id_persona] [int] IDENTITY(1,1) NOT NULL,
    [nombres] [nvarchar](50) NOT NULL,
    [apellido_paterno] [nvarchar](50) NULL,
    [apellido_materno] [nvarchar](50) NULL,
    [fecha_nacimiento] [date] NOT NULL,
    [sexo] [varchar](1) NOT NULL,
    [estado_civil] [nvarchar](50) NOT NULL,
    [calle] [nvarchar](200) NULL,
    [colonia] [nvarchar](100) NULL,
    [codigo_postal] [char](5) NOT NULL,
    [telefonos] [varchar](50) NULL,
    [celular] [varchar](25) NULL,
    [email] [varchar](50) NULL,
)
如何在SQL Server中进行查询,以返回重复nombre、apellido_paterno和apellido_materno的行?我的意思是两行或更多行在这些列中具有相同的数据

我想我在寻找与你想要的不同子句相反的东西

SELECT nombre, apellido_paterno, apellido_materno
  FROM dbo.personas
 GROUP BY nombre, apellido_paterno, apellido_materno
HAVING COUNT(*) > 1
如果要查看实际行,则将其用作内部查询并连接到它。比如

SELECT * 
  FROM personas pOuter INNER JOIN
    (SELECT nombre, apellido_paterno, apellido_materno
      FROM dbo.personas
     GROUP BY nombre, apellido_paterno, apellido_materno
    HAVING COUNT(*) > 1) pInner
    ON pInner.nombre = pOuter.nombre 
   AND pInner.apellido_paterno = pOuter.apellido_paterno
   AND pInner.apellido_materno = pOuter.apellido_materno

一种方法是从集合中减去不同的值。但这是没有效率的!是的,但是我怎么才能知道哪些行是重复的呢?你是在寻找那些有重复的'nombre'、'apellido_paterno'和'apellido_materno'值的记录吗?这听起来像是你要在名字、母系和父系姓氏上重复,这不一定是正确的方法。取决于用户群的大小。如果您要进行重复数据消除,我肯定会包括其他指标。@Ben我只是在寻找一个快速的解决方案,因为我已经做了一些调整,现在您不能复制记录,但在过去,我可能会对您的答案有两个疑问,do和x.rn的意思是什么?@Jorge是您在输出中实际需要的任何列的占位符。这可能是所有列,但列出它们比使用SELECT*更好。x、 rn指在CTE中建立的行号。替换为*并尝试一下。哦,我明白了,答案非常简洁。我只是想知道哪一个答案有更好的性能,我想一旦我的数据库填充得更多,我会尝试这两种方法。谢谢你的时间
;WITH x AS 
(
  SELECT id_personas, rn = ROW_NUMBER() OVER 
  (
   PARTITION BY nombre, apellido_paterno, apellido_materno
   ORDER BY id_personas
  )
  FROM dbo.personas
)
SELECT <col list> 
FROM dbo.personas AS p
WHERE EXISTS 
(
  SELECT 1 FROM x 
  WHERE x.id_personas = p.id_personas 
  AND x.rn > 1
);