自关联去掉组内重复数据
2015-08-12 18:34
246 查看
数据库环境:SQL SERVER 2005
现有一个表的数据如下,id是主键,p1,p2是字符串类型,如果当前行的p1,p2字段的值分别等于其它行
的字段p2,p1的值,则视这2行记录为一组。比如,id=1和id=5就属于同一组数据。同一组数据只显示id最小
的那行记录,没有组的数据全部显示。
View Code
咋一看,似乎也可以实现同样的需求。实际上,这种写法存在2个问题:
1.如果p1,p2是多个字符,ASCII的方式只会取第一个字符的ASCII
2.ASCII('A')+ASCII('D')=ASCII('B')+ASCII('C'),对于这样的数据,用ASCII的方式无法区分
(本文完)
现有一个表的数据如下,id是主键,p1,p2是字符串类型,如果当前行的p1,p2字段的值分别等于其它行
的字段p2,p1的值,则视这2行记录为一组。比如,id=1和id=5就属于同一组数据。同一组数据只显示id最小
的那行记录,没有组的数据全部显示。
WITH c1 AS ( SELECT 1 AS id , 'A' AS p1 , 'B' AS p2 /*UNION ALL SELECT 0 AS id , 'A' AS p1 , 'B' AS p2*/ UNION ALL SELECT 2 AS id , 'C' AS p1 , 'D' AS p2 UNION ALL SELECT 3 AS id , 'E' AS p1 , 'F' AS p2 UNION ALL SELECT 4 AS id , 'D' AS p1 , 'C' AS p2 UNION ALL SELECT 5 AS id , 'B' AS p1 , 'A' AS p2 UNION ALL SELECT 6 AS id , 'H' AS p1 , 'J' AS p2 UNION ALL SELECT 7 AS id , 'T' AS p1 , 'U' AS p2 UNION ALL SELECT 8 AS id , 'J' AS p1 , 'H' AS p2 /*UNION ALL SELECT 9 AS id , 'I' AS p1 , 'L' AS p2 UNION ALL SELECT 10 AS id , 'J' AS p1 , 'K' AS p2*/ ), c2 AS ( SELECT MIN(id) AS min_id FROM c1 GROUP BY ASCII(p1) + ASCII(p2) ) SELECT c1.* FROM c1 JOIN c2 ON id = min_id
View Code
咋一看,似乎也可以实现同样的需求。实际上,这种写法存在2个问题:
1.如果p1,p2是多个字符,ASCII的方式只会取第一个字符的ASCII
2.ASCII('A')+ASCII('D')=ASCII('B')+ASCII('C'),对于这样的数据,用ASCII的方式无法区分
(本文完)
相关文章推荐
- IE 兼容模式下不支持DIV CSS样式display:inline-block,解决
- not in\in与not exists\exists—SQLCookbook
- Problem K: 二进制表示中1的个数
- OData - ASP.NET Web API 2 中Odata路由约定
- 读书笔记-APUE第三版-(10)信号
- Web安全测试之跨站请求伪造(CSRF)
- 【读书笔记】iOS-截屏功能的实现。
- 深入理解Java异常
- hdu 1228 A + B 详细题解 字符串/哈希
- nginx的数据结构集合(随时更新)
- MyEclipse UTF-8环境设置
- 黑马学习笔记_Java 反射技术
- android_线
- 【读书笔记】iOS-截屏功能的实现。
- Spring事务配置的五种方式
- android中获取屏幕的信息
- java虚拟机
- Problem E: 二维数组中的查找
- DoubleLinkedList独立实现,不依赖任何包
- CMDeviceMotion使用