• Jueves 28 de Marzo de 2024, 16:58

Autor Tema:  Consultas Anidadas  (Leído 18730 veces)

Altareum

  • Miembro MUY activo
  • ***
  • Mensajes: 327
    • Ver Perfil
    • http://www.avian.com.ar
Consultas Anidadas
« en: Martes 14 de Agosto de 2007, 15:15 »
0
Hola gente. Ayer me estuve peleando con el SQL, la verdad, cada día quiero más a MySql (seguro que voy a recibir críticas por este comentario).

Estoy tratando de hacer un "subquery", entre comillas porque algunos me dicen que eso no es un subquery, de la forma:

Select * from (select campo1, campo2 from tabla1) as tabla 2

En realidad la consulta que tengo que hacer es más compleja que eso. Lo que necesito, es sacar ciertos datos de tabla1, y en base a esto, usarlo como tabla "temporal" para la consulta (obviamente no me sirve crear una tabla temporal).

En Mysql eso puedo hacerlo, pero no encuentro la forma de implementarlo en SQL server, todo lo que encontré es con un subquery en el where o como un campo más en el select.


Altareum.
El postre!, el postre!, el postre!, el postre!, el postre!, el postre!.....
 | Klinka | Kiree | Avian |

jpaler

  • Miembro MUY activo
  • ***
  • Mensajes: 479
    • Ver Perfil
Re: Consultas Anidadas
« Respuesta #1 en: Miércoles 15 de Agosto de 2007, 00:38 »
0
en mysql he hecho esto:
Citar
Select *,(select c1 from t1),(select c2 from t2) from tabla2
pero no estoy seguro si lo soporta SQL Server y no se si te sirva de algo...
Salu2 !!!

lencho

  • Miembro de PLATA
  • *****
  • Mensajes: 1076
    • Ver Perfil
Re: Consultas Anidadas
« Respuesta #2 en: Miércoles 15 de Agosto de 2007, 02:40 »
0
Cita de: "jpaler"
en mysql he hecho esto:
Citar
Select *,(select c1 from t1),(select c2 from t2) from tabla2
pero no estoy seguro si lo soporta SQL Server y no se si te sirva de algo...
Salu2 !!!
pues si Jpaler, sql server lo soporta.

BYTE.
______________________________________________________________________________________
"No estoy de acuerdo con lo que dices, pero defenderé con mi vida tu derecho a expresarlo"

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Consultas Anidadas
« Respuesta #3 en: Miércoles 15 de Agosto de 2007, 08:31 »
0
Cita de: "Altareum"
...cada día quiero más a MySql (seguro que voy a recibir críticas por este comentario).
pues de mi parte ....  :bravo:  :beer:


Cita de: "Altareum"
Select * from (select campo1, campo2 from tabla1) as tabla 2

Yo recuerdo que si es posible hacer eso, lo que creo no es posible es colocar un alias con espacio "as tabla 2" (as tabla2 / as tabla_2 )

pero si puedes hacer subconsultas de ese tipo (siempre y cuando no devuelvan mas de 1 registro lo normal  :rolleyes: )


Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

Altareum

  • Miembro MUY activo
  • ***
  • Mensajes: 327
    • Ver Perfil
    • http://www.avian.com.ar
Re: Consultas Anidadas
« Respuesta #4 en: Miércoles 15 de Agosto de 2007, 15:43 »
0
Cita de: "F_Tanori"
pero si puedes hacer subconsultas de ese tipo (siempre y cuando no devuelvan mas de 1 registro lo normal  :rolleyes: )
Pues eso es lo que necesito. El problema es que tengo dos tablas, votos_x_video y videos. Votos_x_video contiene un registro por cada voto hecho.
Lo que necesito hacer es obtener los 20 videos más votados y de esos, mostrar 3 aleatoriamente. Obviamente debe ser independiente del lenguaje, por lo cual debo resolverlo con sql.

Había pensado hacer:
Código: Text
  1.  
  2. Select * from (
  3.     select count(votos) as cantidad, id_video
  4.     from votos_x_video
  5.     GROUP BY id_video
  6.     order by cantidad
  7.     limit 20
  8. ) as tabla1
  9. inner join videos
  10. where videos.id_video = tabla.id_video
  11. order by rand()
  12. limit 3
  13.  
  14.  

Pero no se como hacerlo con sql, en mysql funciona bárbaro.
Ojo, la consulta la escribí, como la haría en mysql. por eso los Limit

Altareum.
El postre!, el postre!, el postre!, el postre!, el postre!, el postre!.....
 | Klinka | Kiree | Avian |

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Consultas Anidadas
« Respuesta #5 en: Miércoles 15 de Agosto de 2007, 16:38 »
0
Ese es uno de los problemas de SQL server que no tiene limit  :angry:


En su lugar y a veces no es suficiente esta SELECT TOP #


Bueno espero aunque sea pueda aportar un poco a tu causa, pues hace tiempo que no uso SQL server, y pues como no lo uso no lo tengo instalado....

Es una pena no poder probar las consultas :(

Se supone y si SQL SERVER no se pone necio con esta consulta extraerias 20 registros que tengan los votos mas altos
<!--sql--></div><table border='0' align='center' width='95%' cellpadding='3' cellspacing='1'><tr><td>SQL </td></tr><tr><td id='CODE'><!--sql1-->[color=blue;font-weight]Select[/color] Top 20 v.descripcion,
ifnull(([color=blue;font-weight]SELECT[/color] count(*) FROM voto_x_video vxv where v.id_video=vxv.id_video GROUP BY vxv.id_video),0) cantidad
From videos v GROUP BY v.id_video order by cantidad desc <!--sql2--></td></tr></table><div class='postcolor'><!--sql3-->

y supuesta mente para ordenar aleatoriamente

http://www.petefreitag.com/item/466.cfm
http://www.planet-source-code.com/vb/scrip...Id=679&lngWId=5

Espero te ayude
Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================

Altareum

  • Miembro MUY activo
  • ***
  • Mensajes: 327
    • Ver Perfil
    • http://www.avian.com.ar
Re: Consultas Anidadas
« Respuesta #6 en: Jueves 16 de Agosto de 2007, 02:24 »
0
Bue... al final lo resolví, pero de una forma totalmente distinta.
Lo dejo por si le sirve a alguien:

Citar
Select top 3 id_video,titulo
   from videos
   where id_video IN (
      select top 20 id_video
      from HIT_X_VIDEO
      GROUP BY id_video
      order by count(HIT_X_VIDEO.id_video) DESC
   )
   order by NEWID()


Altareum.
El postre!, el postre!, el postre!, el postre!, el postre!, el postre!.....
 | Klinka | Kiree | Avian |