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
);