Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 查找重复项的查询_Mysql_Sql_Sql Server_Database_Oracle - Fatal编程技术网

Mysql 查找重复项的查询

Mysql 查找重复项的查询,mysql,sql,sql-server,database,oracle,Mysql,Sql,Sql Server,Database,Oracle,我有一个具有以下架构的表: 客户(id INT、name VARCHAR(10)、height VARCHAR(10)、weight INT) id是主键。我想找出那些名字、身高和体重完全相同的人所在的行。换句话说,我想找出与姓名、身高和体重相关的重复项 示例表: 1, sam, 160, 100 2, ron, 167, 88 3, john, 150, 90 4, sam, 160, 100 5, rick, 158, 110 6, john, 150, 90 7, sam, 166, 11

我有一个具有以下架构的表:

客户(id INT、name VARCHAR(10)、height VARCHAR(10)、weight INT)

id
是主键。我想找出那些名字、身高和体重完全相同的人所在的行。换句话说,我想找出与
姓名
身高
体重
相关的重复项

示例表:

1, sam, 160, 100
2, ron, 167, 88
3, john, 150, 90
4, sam, 160, 100
5, rick, 158, 110
6, john, 150, 90
7, sam, 166, 110
示例输出:

1, sam, 160, 100
2, ron, 167, 88
3, john, 150, 90
4, sam, 160, 100
5, rick, 158, 110
6, john, 150, 90
7, sam, 166, 110
现在既然有相同姓名、相同身高和相同体重的人:

sam(id=1)、sam(id=4)

john(id=3)、john(id=6)

我想要这些证件。如果每次比赛我只得到一个
id
(即第一场比赛id=1,第二场比赛id=3),也可以


我正在尝试这个查询,但不确定它是否正确

SELECT id
FROM customers
GROUP BY name, height, weight

你走在正确的道路上:

SELECT min(id)
FROM customers
GROUP BY name, height, weight
HAVING COUNT(*) > 1
请尝试以下操作(对sql server有效):

如你所问-每场比赛只有一个Id

SELECT 
    t.NAME,
    c.Id
FROM
(
    SELECT Name, height, weight
    FROM Customers
    GROUP BY Name, height, weight
    HAVING COUNT(*) > 1
) t
JOIN Customers c ON t.NAME AND c.Weight = t.Weight AND c.Height = t.Height

我不知道你在用什么,因为你标记了几个数据库

在Sql server中,如果不将id放入
select
,您将无法选择该id

因此,如果您想选择组类别中的字段之外的其他字段,可以使用
分区依据
。大概是这样的:

SELECT id,
ROW_NUMBER() OVER(PARTITION BY c.name, c.height, c.weight ORDER BY c.name) AS DuplicateCount
FROM customers c
这将为您提供具有相同名称、高度和重量的副本的ID。

我不确定这是否比其他解决方案更快,但是,您可以对其进行分析和比较。

如果可以按照您所说的每次匹配只获取一个id,那么您就接近解决方案了:

SELECT 
   min( id )
  ,name, height, weight  --<-- oncly if you need/want
FROM customers
GROUP BY name, height, weight
HAVING count(*) > 1
选择
最小(id)
,姓名,身高,体重--1

我认为这种方式行不通,因为您必须在group by子句中添加id字段。这应该行得通。我建议使用DuplicateCustomers而不是X作为您的内部select表名。我的朋友,您完全正确。我只是没有注意它,因为它只是一个简单的例子。Teşekkürler:)可能重复
SELECT id,
ROW_NUMBER() OVER(PARTITION BY c.name, c.height, c.weight ORDER BY c.name) AS DuplicateCount
FROM customers c
SELECT 
   min( id )
  ,name, height, weight  --<-- oncly if you need/want
FROM customers
GROUP BY name, height, weight
HAVING count(*) > 1