我想要从表中选择记录,或将它们插入新的空白表中,其中多个列与数据库中的另一条记录相同。问题类似于此问题。 在MySQL中查找重复记录 但是,仅比较一列。另外,我的一列,例如下面的示例中的C列,是整数。就像上面链接中的问题一样,我希望返回每一行。不幸的是,我对联接如何如何自行解决还不够熟悉。我知道下面的代码与实际的SQL代码完全不同,这只是我可以想到的最清晰的方式来描述我要进行的比较。
SELECT ColumnE, ColumnA, ColumnB, ColumnC from table where ( Row1.ColumnA = Row2.ColumnA && Row1.ColumnB = Row2.ColumnB && Row1.ColumnC = Row2.ColumnC )
任何帮助将不胜感激,我看到的所有“从MYSQL中选择重复项”问题都只使用一列作为比较。
如果要计算多个列之间的重复项,请使用group by:
group by
select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates from table group by ColumnA, ColumnB, ColumnC
如果只希望重复的值,则计数大于1。可使用以下having子句获得此值:
having
select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates from table group by ColumnA, ColumnB, ColumnC having NumDuplicates > 1
如果您实际上希望所有重复的行都返回,则将最后一个查询返回到原始数据:
select t.* from table t join (select ColumnA, ColumnB, ColumnC, count(*) as NumDuplicates from table group by ColumnA, ColumnB, ColumnC having NumDuplicates > 1 ) tsum on t.ColumnA = tsum.ColumnA and t.ColumnB = tsum.ColumnB and t.ColumnC = tsum.ColumnC
假设所有列值都不为NULL,这将起作用。如果是这样,请尝试:
on (t.ColumnA = tsum.ColumnA or t.ColumnA is null and tsum.ColumnA is null) and (t.ColumnB = tsum.ColumnB or t.ColumnB is null and tsum.ColumnB is null) and (t.ColumnC = tsum.ColumnC or t.ColumnC is null and tsum.ColumnC is null)
编辑:
如果有NULL值,也可以使用NULL-safe运算符:
NULL
on t.ColumnA <=> tsum.ColumnA and t.ColumnB <=> tsum.ColumnB and t.ColumnC <=> tsum.ColumnC