Autor Tema: temita con CROSS APPLY  (Leído 4095 veces)

0 Usuarios y 1 Visitante están viendo este tema.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
temita con CROSS APPLY
« en: Octubre 01, 2013, 11:24:34 am »
Consulta hay alguna manera de quitar la tabla del from en la sig consulta? o de rehacerla de manera tal que mantenga la funcionalidad? lo unico que hace es devolver un int que no exista en la tabla tdot_selection.id_selection

Código: [Seleccionar]
SELECT TOP 1 CONVERT(INT, Val)
FROM   tdot_selection
       CROSS APPLY (SELECT( Floor(Rand() * CONVERT(INT, 0x7FFFFFFF)) )) AS Random(Val)
WHERE  Val NOT IN (SELECT id_selection
                   FROM   tdot_selection)

Gracias

ssccaann43

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:temita con CROSS APPLY
« Respuesta #1 en: Octubre 01, 2013, 11:58:47 am »
Consulta hay alguna manera de quitar la tabla del from en la sig consulta? o de rehacerla de manera tal que mantenga la funcionalidad? lo unico que hace es devolver un int que no exista en la tabla tdot_selection.id_selection

Código: [Seleccionar]
SELECT TOP 1 CONVERT(INT, Val)
FROM   tdot_selection
       CROSS APPLY (SELECT( Floor(Rand() * CONVERT(INT, 0x7FFFFFFF)) )) AS Random(Val)
WHERE  Val NOT IN (SELECT id_selection
                   FROM   tdot_selection)

Gracias

Buenas,

Inicialmente desconozco porque usas el CROSS APPLY si en esta consulta que generas, estas forzando a que te muestre el TOP1, es decir el primer registro, por lo cual el CROSS APPLY no hace nada, a mi parecer.

Es como si hicieras esto:

Código: [Seleccionar]
SELECT TOP 1 convert(int,3) as Val from dbo.CualquierTabla CROSS APPLY(SELECT( Floor(Rand() * CONVERT(INT, 0x7FFFFFFF)) )) AS Random(VAL)
SELECT TOP 1 convert(int,3) as Val from dbo.CualquierTabla CROSS APPLY(SELECT( Floor(Rand() * CONVERT(INT, 5)) )) AS Random(VAL)
SELECT TOP 1 convert(int,3) as Val from dbo.CualquierTabla

Eso te arrojará siempre el Numero 3.

Ahora:
Código: [Seleccionar]
WHERE  Val NOT IN (SELECT id_selection
                   FROM   tdot_selection)

Hace que tu consulta muestre solamente el Primer Valor Registrado mientras no este en esa tabla...!

Saludos
Miguel Núñez.

cobein

  • Moderador Global
  • Gigabyte
  • *****
  • Mensajes: 348
  • Reputación: +63/-0
  • Más Argentino que el morcipan
    • Ver Perfil
Re:temita con CROSS APPLY
« Respuesta #2 en: Octubre 01, 2013, 12:38:51 pm »
Scan, eso mismo es lo que tiene que hacer muestra el primer valor random que no este en la tabla, el cross apply lo uso para poder aplicar el valor random al select y al where.

ssccaann43

  • Moderador
  • Terabyte
  • *****
  • Mensajes: 970
  • Reputación: +97/-58
    • Ver Perfil
    • Sistemas Nuñez, Consultores y Soporte, C.A.
Re:temita con CROSS APPLY
« Respuesta #3 en: Octubre 01, 2013, 12:55:56 pm »
No se,

Se me ocurre algo como esto:

Código: [Seleccionar]

SELECT ( Floor(Rand() * CONVERT(INT, 0x7FFFFFFF)) )
WHERE ( Floor(Rand() * CONVERT(INT, 0x7FFFFFFF)) ) NOT IN (SELECT id_selection
                   FROM   tdot_selection)

Miguel Núñez.