Ver Mensaje Individual
  #2 (permalink)  
Antiguo 20/02/2008, 16:59
Avatar de Beakdan
Beakdan
 
Fecha de Ingreso: diciembre-2001
Ubicación: Monterrey, Nuevo León
Mensajes: 433
Antigüedad: 23 años, 1 mes
Puntos: 7
Re: Subconjuntos De Una Tabla

Bueno, tu problema es de lo más interesante, me tuvo pensando un buen rato, pero la solución se simplifica con la ayuda de una tabla auxiliar.
Si intentas generar las distintas combinaciones con T-SQL vas a tener un problema bastante serio y te convendría mejor hacerlo de otra manera.
Sin embargo, si tuvieras una tabla auxiliar con las permutaciones el problema se reduce a una serie de joins en una consulta. Ahora bien, es de notar que el numero de subconjuntos posibles para un conjunto dado es 2 a la n (n el número de elementos). Por lo tanto, es muy importante saber de antemano la máxima cantidad de elementos existentes para cada num_pre. Esto determina el tamaño de la tabla auxiliar y determina además la cantidad de joins que se deben indicar en la consulta.
Para que el resultado sea realmente correcto, en el resultado para cada num_pre debe haber también un resultado nulo (se incluye una permutación para lograrlo), ya que el conjunto vacío es subconjunto de todo conjunto. Este punto debe ser posible, sólo que el query se tornaría más complejo.
El orden de los subconjuntos es irrelevante en teoría, pero se ve muy bien cuando la secuencia del resultado es monótona. Esto es fácil de conseguir con un campo de orden en la tabla auxiliar.
Traté de hacer un algoritmo que generara las secuencias que deben existir en la tabla auxiliar (con C++), pero he terminado con un enredo recursivo que no devuelve todos los valores como espero, así que la solución que te publico aquí implica construir "a mano" la tabla auxiliar. Para cuatro elementos en cada grupo una tabla con 16 registros basta.
Ah, la solución depende completamente de las características disponibles en SQL Server 2005. Para SQL Server 2000, sería un poco más complicado, pero posible.
Código:
CREATE TABLE Subconjuntos(
  num_pre INT,
  pre_id INT,
  desc_pre CHAR(1)
)
GO
 
CREATE TABLE Permutaciones(
  Id SMALLINT IDENTITY(1,1) NOT NULL,
  n1 SMALLINT NOT NULL,
  n2 SMALLINT NOT NULL,
  n3 SMALLINT NOT NULL,
  n4 SMALLINT NOT NULL,
  MaxN SMALLINT NOT NULL
)
GO