Re: distinct subset query

From: Tonkuma <tonkuma_at_jp.ibm.com>
Date: 16 Jul 2006 04:23:04 -0700
Message-ID: <1153048984.442738.186100_at_m73g2000cwd.googlegroups.com>


This way is that first find duplicated set# by modification of Relational Division, then elemenate them from the result.

Here is an example:
CREATE TABLE Equiv_Classes
(set# INTEGER NOT NULL
,element CHAR(2) NOT NULL
,PRIMARY KEY (set#, element)
);

I added some more dara:
[a],[a,b],[a,b],[a,b,c],[a,b,c,d],[a,b,c,e],[a,b,c,d,e],[a,b,c,d,e],[a,b,c,d,e]

INSERT INTO Equiv_Classes
VALUES

 (1, 'a')

,(1, 'b')
,(2, 'a')
,(2, 'b')
,(3, 'a')
,(4, 'a')
,(4, 'b')
,(4, 'c')
,(5, 'a')
,(5, 'b')
,(5, 'c')
,(5, 'd')
,(6, 'a')
,(6, 'b')
,(6, 'c')
,(6, 'e')
,(7, 'a')
,(7, 'b')
,(7, 'c')
,(7, 'd')
,(7, 'e')
,(8, 'a')
,(8, 'b')
,(8, 'c')
,(8, 'd')
,(8, 'e')
,(9, 'a')
,(9, 'b')
,(9, 'c')
,(9, 'd')
,(9, 'e');

Query and results:
SELECT *
  FROM Equiv_Classes R
 WHERE set# NOT IN

       (SELECT S2.set#
          FROM (SELECT set#, COUNT(*) AS element_cnt
                  FROM Equiv_Classes
                 GROUP BY
                       set#
               ) AS S1
               INNER JOIN
               (SELECT set#, COUNT(*) AS element_cnt
                  FROM Equiv_Classes
                 GROUP BY
                       set#
               ) AS S2
                 ON  S1.set#        < S2.set#
                 AND S1.element_cnt = S2.element_cnt
         WHERE NOT EXISTS
               (SELECT *
                  FROM Equiv_Classes S3
                 WHERE S3.set# = S1.set#
                   AND NOT EXISTS
                       (SELECT *
                          FROM Equiv_Classes S4
                         WHERE S4.set# = S2.set#
                           AND S3.element = S4.element
                       )
               )
       )
 ORDER BY
       R.set#, R.element

;

SET# ELEMENT
----------- -------

          1 a
          1 b
          3 a
          4 a
          4 b
          4 c
          5 a
          5 b
          5 c
          5 d
          6 a
          6 b
          6 c
          6 e
          7 a
          7 b
          7 c
          7 d      
          7 e      

  19 record(s) selected. Received on Sun Jul 16 2006 - 13:23:04 CEST

Original text of this message