【问题标题】:How to check a column for duplicate values and return rows containing them如何检查列中是否存在重复值并返回包含它们的行
【发布时间】:2016-12-10 20:56:21
【问题描述】:

我正在编写一个在 SQL 上运行的脚本。查询是检查选取的列(在本例中为 kolumna1、kolumna2 或 kolumna3)是否存在重复值。然后,在找到这些值之后,我想返回包含这些值的每一行。例如,查看我拥有的表,如果我查看 kolumna1 列,其中一个重复值将在第 2 行和第 8 行中。所以在这种情况下,我想返回整个第二行和第八行。 当然主要目标是返回具有重复值的每一行,这只是一个更简单的示例。

桌子:

INSERT INTO `tabela_testowa` (`id`, `kolumna1`, `kolumna2`, `kolumna3`, `kolumna4`) VALUES
(1, 'wartosc1', 'wartosc2', 'wartosc3', 1),
(2, 'warosc21', 'wartosc22', 'wartosc23', 5),
(3, 'wartosc31', 'wartosc22', 'wartosc32', 6),
(4, 'wartosc54', 'wartosc43', 'wartosc45', 4),
(5, 'wartosc43', 'wartosc23', 'wartosc34', 4),
(6, 'wartosc43', 'wartosc54', 'wartosc43', 2),
(7, 'wartosc54', 'wartosc52', 'wartosc53', 8),
(8, 'wartosc21', 'wartosc22', 'wartosc43', 4),
(9, 'wartosc43', 'wartosc33', 'wartosc45', 9),
(10, 'wartosc87', 'wartosc62', 'wartosc11', 3);

到目前为止,我已经设法编写了一个几乎可以正常工作的查询。几乎我的意思是它返回重复项,但每个只返回一次。

查询:

SELECT id, kolumna1 
FROM tabela_testowa
GROUP BY kolumna1
HAVING ( COUNT(kolumna1) > 1 );

编辑:我正在使用 mysql。另外,为了澄清我只想搜索我选择的一列来搜索重复值,然后显示包含它们的整行(当然我的意思是两行,比如第 2 行和第 8 行)。

【问题讨论】:

  • 首先决定你的 DBMS,MYSQL SQL SERVER
  • 我刚刚注意到我实际上选择了 sql server 标签。我只使用mysql,现在在编辑中更改它。

标签: mysql


【解决方案1】:

如果没有错,你正在寻找这个

适用于MysqlSql Server

Correlated Sub-Query方法

select * 
from Yourtable A
Where Exists (select 1 from Yourtable B where a.kolumna1 =b.kolumna1  
              HAVING  COUNT(1) > 1 )

另一种方法,过滤kolumna1,它有多个记录并加入您的表

Select A.* From Yourtable A
(
select kolumna1 
From Yourtable
Group by kolumna1 
Having Count(1) > 1
) B 
ON A.kolumna1= B.kolumna1 

更新:别名的范围在选择查询结束时结束,您不能那样使用它。试试这个方法

SELECT *
FROM   tabela_testowa tab1
WHERE  EXISTS (SELECT 1
               FROM   tabela_testowa tab2
               WHERE  tab1.kolumna1 = tab2.kolumna1
               HAVING Count(1) > 1) 

如果您使用的是SQL SERVER

Select * From
(
select *,Count(1)Over(Partition by kolumna1) as cnt
from Yourtable 
)A
Where cnt > 1

【讨论】:

  • 如果我错了,请纠正我,但你不是在这里使用两个表吗?因为我只想检查一张表中的一列。还是您的答案是使用别名?
  • @AleksanderSadaj - 要获得结果,您需要参考同一张表两次。为了区分引用的列,我们需要使用别名
  • 我尝试了第一个解决方案。我使用的确切代码:SELECT id, kolumna1, kolumna2, kolumna3, kolumna4 FROM tabela_testowa AS tab1;从 tabela_testowa AS tab2 中选择 id、kolumna1、kolumna2、kolumna3、kolumna4; select * from tab1 Where Exists (select 1 from tab2 where tab1.kolumna1 = tab2.kolumna1 HAVING COUNT(1) > 1 ) 我收到一条错误消息 #1146 - 表 'baza_danych_testowa.tab1' 不存在 但如果我没有错,我一开始就声明了别名,那么这里有什么问题?
  • 很抱歉,我花了这么长时间才回复。更新有效!非常感谢,我已经为此苦苦挣扎了一整天!
猜你喜欢
  • 2023-03-28
  • 2019-07-12
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2023-01-24
相关资源
最近更新 更多