您的位置:首页 > 其它

自关联去掉组内重复数据

2015-08-12 18:34 246 查看
数据库环境:SQL SERVER 2005

  现有一个表的数据如下,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的方式无法区分

(本文完)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: