SQL自连接查询返回重复行且列值互换问题求助
嘿,我太懂你这种烦恼了!自连接找列值不等的实例时,总会冒出那些“镜像”重复行——俩行除了要比较的列值互换之外完全一样,DISTINCT根本搞不定,因为它们本质是不同的行嘛。
解决这个问题的关键其实很简单:在连接条件或者WHERE子句里加个顺序限制,让你要比较的列值始终保持一个固定的大小关系,这样就不会生成反向的重复行了。
举个具体的例子,假设你的表叫data_table,公共ID列是group_id,要对比的列是status,原来的查询大概是这样:
SELECT a.group_id, a.status AS status_a, b.status AS status_b FROM data_table a JOIN data_table b ON a.group_id = b.group_id WHERE a.status != b.status
这时候就会返回像(group1, 'active', 'inactive')和(group1, 'inactive', 'active')这样的成对行。
那你只需要把WHERE条件改成小于比较,就能只保留其中一行:
SELECT a.group_id, a.status AS status_a, b.status AS status_b FROM data_table a JOIN data_table b ON a.group_id = b.group_id WHERE a.status < b.status
这样数据库只会返回a.status比b.status“小”的那一组,不管是数值还是字符串类型的列,这个逻辑都适用(字符串会按照字符编码的顺序来比较)。
如果你的场景里还有需要排除同一行自连接的情况(比如同一个group_id下有完全相同的行),还可以再加个条件a.id != b.id(假设表有唯一主键id),但如果你的WHERE已经是a.status != b.status,其实已经隐含了这一点,除非有同一行的状态既等于又不等于自己,这显然不可能。
这个方法从根源上避免了生成重复的镜像行,比事后去重高效多啦!
内容的提问来源于stack exchange,提问作者TomB
相关产品推荐
相关产品推荐

