返回三列中具有相同数据的行

时间:2012-07-26 15:46:38

标签: 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] 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中进行查询以返回重复nombreapellido_paternoapellido_materno的行?我的意思是这些列中有两行或更多行具有相同的数据。

我想我正在寻找与DISTINCT子句

相反的东西

2 个答案:

答案 0 :(得分:5)

你想要......

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

答案 1 :(得分:3)

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