国产探花免费观看_亚洲丰满少妇自慰呻吟_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
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 河间市| 浙江省| 方城县| 修武县| 双桥区| 铅山县| 淮滨县| 万宁市| 舟山市| 汽车| 塔城市| 平和县| 北流市| 苍溪县| 吴川市| 富阳市| 民丰县| 博白县| 竹北市| 巴中市| 科尔| 康平县| 绿春县| 巴楚县| 大同县| 团风县| 威信县| 三原县| 威宁| 武功县| 湘乡市| 汉源县| 岳阳县| 盐城市| 固安县| 闽清县| 刚察县| 离岛区| 嘉义市| 三亚市| 富锦市|