国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > 綜合 > 正文

自關聯去掉組內重復數據

2024-07-21 02:46:08
字體:
來源:轉載
供稿:網友
自關聯去掉組內重復數據

數據庫環境:SQL SERVER 2005

  現有一個表的數據如下,id是主鍵,p1,p2是字符串類型,如果當前行的p1,p2字段的值分別等于其它行

的字段p2,p1的值,則視這2行記錄為一組。比如,id=1和id=5就屬于同一組數據。同一組數據只顯示id最小

的那行記錄,沒有組的數據全部顯示。

實現思路:

  將表進行自關聯左聯,假設表的別名是a,b,根據id進行關聯,對關聯后的結果集進行過濾。如果b.id是空的,則保留,

如果b.id不為空,則只保留a.id比b.id小的記錄。

實現的SQL腳本:

/*1.數據準備*/WITH    x0          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*/             ),/*2.去重*/        x1          AS ( SELECT   id ,                        p1 ,                        p2               FROM     ( SELECT    id ,                                    p1 ,                                    p2 ,                                    ROW_NUMBER() OVER ( PARTITION BY p1, p2 ORDER BY id ) AS rn                          FROM      x0                        ) t               WHERE    rn = 1             )    /*3.求值*/    SELECT  a.id ,            a.p1 ,            a.p2    FROM    x1 a            LEFT JOIN x1 b ON b.p1 = a.p2                              AND b.p2 = a.p1    WHERE   b.id IS NULL            OR a.id < b.id
View Code

最終實現的效果如圖:

也有網友提出通過ASCII來實現,他的實現SQL腳本如下:

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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 深水埗区| 大连市| 临夏县| 宜良县| 白河县| 奉贤区| 广丰县| 定西市| 兴安盟| 攀枝花市| 贡山| 徐州市| 乌兰浩特市| 专栏| 海晏县| 澜沧| 罗甸县| 汉川市| 通化县| 武鸣县| 阳江市| 沙雅县| 奉化市| 灌云县| 青川县| 教育| 陆河县| 灵丘县| 上犹县| 自贡市| 宁明县| 万宁市| 柳江县| 新郑市| 长汀县| 蒲城县| 石狮市| 汕头市| 聂荣县| 平江县| 墨竹工卡县|