2012-05-30 18 views
12

¿Hay alguna manera de combinar estas dos instrucciones en una sola sin tener entradas duplicadas?Combine dos declaraciones con LÍMITES utilizando UNION

SELECT * FROM Seq where JULIANDAY('2012-05-25 19:02:00')<=JULIANDAY(TimeP) 
     order by TimeP limit 50 

SELECT * FROM Seq where JULIANDAY('2012-05-29 06:20:50')<=JULIANDAY(TimeI) 
     order by TimeI limit 50 

Mi primer, intento obvio no es compatible con SQLITE (Error de sintaxis: cláusula de límite de venir después de UNION no antes):

SELECT * FROM Seq where JULIANDAY('2012-05-25 19:02:00')<=JULIANDAY(TimeP) 
     order by TimeP limit 50 
UNION 
SELECT * FROM Seq where JULIANDAY('2012-05-29 06:20:50')<=JULIANDAY(TimeI) 
     order by TimeI limit 50 

Respuesta

24

Utilizar subconsultas y llevar a cabo el límite dentro de ellos.

SELECT * 
FROM ( SELECT * 
      FROM Seq 
      WHERE JULIANDAY('2012-05-25 19:02:00') <= JULIANDAY(TimeP) 
      ORDER BY TimeP 
      LIMIT 50 
     ) 
UNION 
SELECT * 
FROM ( SELECT * 
      FROM Seq 
      WHERE JULIANDAY('2012-05-29 06:20:50') <= JULIANDAY(TimeI) 
      ORDER BY TimeI 
      LIMIT 50 
     ) 
+0

Esto parece funcionar. Muchas gracias. ¿Podría explicar por qué usa 'AS a'? ¿Es necesario? – nabulke

+0

No es necesario y simplemente se hace por hábito. Paso todo el día usando SQL-Server y eso requiere que todas las subconsultas tengan un alias, SQLite no. Eliminé los alias (e hice una corrección porque utilicé TimeP en lugar de TimeI en la segunda consulta). – GarethD

+1

tú gobiernas el mundo. No importa qué tan específica y extraña sea mi pregunta, siempre hay alguien en StackOverflow que la ha pedido y alguien que la ha respondido. – Nico

2
  SELECT * from 
      (SELECT * 
      FROM Seq 
      where JULIANDAY('2012-05-25 19:02:00')<=JULIANDAY(TimeP) 
      order by TimeP limit 50) 
      UNION 
      SELECT * from 
      (SELECT * 
      FROM Seq 
      where JULIANDAY('2012-05-29 06:20:50')<=JULIANDAY(TimeI) 
      order by TimeI limit 50) 

Esto debería hacer el truco

+0

Gracias. Parece estar funcionando. Comprobándolo ahora ... – nabulke

7

Las consultas se procesan en etapas:

  1. FROM cláusula y todas las uniones;
  2. WHERE cláusula y todos los predicados. Entonces, si desea ver NULL valores en el conjunto de resultados, nunca debe filtrar OUTER columnas de tabla unidas en la sección WHERE, ya que esto convertirá su consulta en INNER join;
  3. GROUP BY y HAVING cláusula;
  4. combinaciones de consulta: UNION, INTERSECT, EXCEPT o MINUS
  5. ORDER BY
  6. LIMIT

Por lo tanto, como otros señalaron, es incorrecto utilizar syntatically ORDER BY y LIMITantesUNION cláusula. Debería usar subconsultas:

SELECT * 
    FROM (SELECT * FROM Seq 
     WHERE JULIANDAY('2012-05-25 19:02:00') <= JULIANDAY(TimeP) 
     ORDER BY TimeP LIMIT 50) AS tab1 
UNION 
SELECT * 
    FROM (SELECT * FROM Seq 
     WHERE JULIANDAY('2012-05-29 06:20:50') <= JULIANDAY(TimeI) 
     ORDER BY TimeI LIMIT 50) AS tab2;