Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Unir dos consultas (una de ellas aleatoria)

Estas en el tema de Unir dos consultas (una de ellas aleatoria) en el foro de SQL Server en Foros del Web. Hola, Tengo un problemilla sobre el que agradeceria cualquier ayuda. Estoy intentando extraer de una tabla dos resultados diferentes y unirlos en una misma consulta. ...
  #1 (permalink)  
Antiguo 22/09/2010, 03:39
 
Fecha de Ingreso: marzo-2004
Mensajes: 34
Antigüedad: 20 años, 7 meses
Puntos: 0
Unir dos consultas (una de ellas aleatoria)

Hola,

Tengo un problemilla sobre el que agradeceria cualquier ayuda.

Estoy intentando extraer de una tabla dos resultados diferentes y unirlos en una misma consulta. Las dos consultas por separado son las siguientes:

select * from coches where portada=1
select top 9 * from coches where portada<>1 order by newid()

Necesito extraer los registros con portada=1 y que despues se añadan 9 registros aleatorios con portada<>1, pero no lo consigo. He intentado con "UNION" entre las dos consultas, pero me aparece el siguiente error:
Sintaxis incorrecta cerca de la palabra clave 'order'

En cuanto le quito "order by newid()" funciona, pero necesito que sea aleatorio el resultado de la segunda consulta.

Espero haberme explicado bien. Gracias. Un saludo.
  #2 (permalink)  
Antiguo 22/09/2010, 08:55
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 19 años, 3 meses
Puntos: 39
Respuesta: Unir dos consultas (una de ellas aleatoria)

Asi te sirve?
Código SQL:
Ver original
  1. SELECT newid(),* FROM coches WHERE portada=1
  2. UNION
  3. SELECT top 9 newid(),* FROM coches WHERE portada<>1 ORDER BY newid()
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #3 (permalink)  
Antiguo 22/09/2010, 10:08
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Unir dos consultas (una de ellas aleatoria)

No me gusta mucho esta comparacion

portada<>1

Creo que si ha valores de 1 y no de 0 o menores, deberia ser

portada > 1
__________________
MCTS Isaias Islas
  #4 (permalink)  
Antiguo 22/09/2010, 12:42
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Unir dos consultas (una de ellas aleatoria)

Creo que la respuesta del compañero Flaviovich es correcta, sin embargo si requieres que en la primer posición siempre aparezca el registro con portada = 1 entonces puedes hacerlo así:

Código SQL:
Ver original
  1. SELECT 1 AS nivel, newid(), * FROM coches WHERE portada=1
  2. UNION
  3. SELECT top 9 2 AS nivel, newid(), * FROM coches WHERE portada<>1
  4. ORDER BY nivel, newid()

Saludos
Leo.
  #5 (permalink)  
Antiguo 22/09/2010, 12:53
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Unir dos consultas (una de ellas aleatoria)

Pero insisto, las comparaciones <>, deben dejarse como un caso extremo, no?
__________________
MCTS Isaias Islas
  #6 (permalink)  
Antiguo 22/09/2010, 13:36
Avatar de flaviovich  
Fecha de Ingreso: agosto-2005
Ubicación: Lima, Peru
Mensajes: 2.951
Antigüedad: 19 años, 3 meses
Puntos: 39
Respuesta: Unir dos consultas (una de ellas aleatoria)

Tal vez si explicas la diferencia, muchos dejaran de usar <>.
__________________
No repitamos temas, usemos el Motor de busquedas
Plantea bien tu problema: Ayúdanos a ayudarte.
  #7 (permalink)  
Antiguo 22/09/2010, 15:17
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 17 años, 4 meses
Puntos: 180
Respuesta: Unir dos consultas (una de ellas aleatoria)

Bueno, ya lo habia hecho con anterioridad, lo vuelvo a hacer sin problema.

Existe un DOCUMENTO de Microsoft - Services, llamado "Guia del desarrollo" (que algunos me pidieron y se los envie), que dice en su parrafo:

4.10 SQL Server Best Practices

33. Los operadores de la cláusula WHERE afectan la velocidad en la resolución de una consulta. Se debe usar mas el operador “=” y usar menos el operador “<>” (en lo posible). En su orden de rapidez son:
 =
 >, >=, <, <=
 LIKE
 <>

36. Hay que evitar, en lo posible, utilizar en la cláusula WHERE argumentos tales como "IS NULL", "<>", "!=", "!>", "!<", "NOT", "NOT EXISTS", "NOT IN", "NOT LIKE", "LIKE '%500'". Generalmente este tipo de condiciones no permiten que SQL Server pueda utilizar los índices, aunque las columnas usadas hagan parte de él. Esto aplica también para condiciones que utilicen funciones en la columna (SUBSTR, LOWER, UPPER, DATEDIFF)
__________________
MCTS Isaias Islas
  #8 (permalink)  
Antiguo 23/09/2010, 08:07
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: Unir dos consultas (una de ellas aleatoria)

De acuerdo con Iislas, pero hay que considerar un pequeño detalle y es que el compañero demlon que fue quien lanzó la pregunta aun no ha contestado.

La condición que planteas (portada > 1) sólo aplicaría si los valores para esta variable no son 0 o menores como lo explicas también en tu post, pero de manera particular yo no sé cómo tiene organizado los datos, por eso dejé la condición original que colocó el autor del post.

Saludos
Leo.
  #9 (permalink)  
Antiguo 07/10/2010, 11:04
 
Fecha de Ingreso: marzo-2004
Mensajes: 34
Antigüedad: 20 años, 7 meses
Puntos: 0
Respuesta: Unir dos consultas (una de ellas aleatoria)

Perdonad por no haber contestado antes, he estado fuera. Probare las alternativas que me indicais, y tendre en cuenta lo que indica iislas sobre <>.

Gracias a todos.

Etiquetas: aleatoria, dos, unir
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 2 personas




La zona horaria es GMT -6. Ahora son las 04:17.