我正在编写一个运行SQL的脚本。查询是检查拾取的列(在本例中为kolumna1,kolumna2或kolumna3)是否有重复值。然后,在找到这些值之后,我想返回包含此值的每一行。例如,查看我的表,如果我查看kolumna1列,其中一个重复值将在行(id)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行)。
答案 0 :(得分:0)
如果没有错,你正在寻找这个
适用于Mysql
和Sql 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