2012-05-30 10 views
12

Czy istnieje sposób na połączenie tych dwóch zdań w jedno bez duplikowania wpisów?Połączyć dwie instrukcje z LIMITAMI przy użyciu 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 

Moje pierwsze, oczywiste próba nie jest obsługiwany przez SQLITE (Syntax error: klauzuli limit powinien przyjść po Unii nie wcześniej):

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 

Odpowiedz

24

Wpisz podzapytania i wykonywać w nich limit.

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

To wydaje się działać. Dziękuję Ci bardzo. Czy mógłbyś wyjaśnić, dlaczego używasz 'AS a'? Czy to konieczne? – nabulke

+0

Nie jest to konieczne i jedynie wykonywane z przyzwyczajenia. Cały dzień korzystam z SQL-Server i wymaga to, aby wszystkie podzapytania były aliasowane, SQLite nie. Usunąłem aliasy (i zrobiłem poprawkę, ponieważ użyłem TimeP zamiast TimeI w drugim zapytaniu). – GarethD

+1

rządzisz światem. Nie ma znaczenia, jak konkretne i dziwne jest moje pytanie, zawsze jest ktoś w StackOverflow, który o to pyta, i ktoś, kto na nie odpowiedział. – 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) 

To powinno załatwić sprawę

+0

Dziękuję. Wygląda na to że działa. Sprawdzam teraz ... – nabulke

7

Zapytania są przetwarzane w etapach:

  1. FROM klauzuli i wszystkie przyłącza;
  2. WHERE Klauzula i wszystkie predykaty. Jeśli więc chcesz zobaczyć wartości NULL w zestawie wynikowym, nigdy nie powinieneś filtrować OUTER -połączonych kolumn tabeli w sekcji WHERE, ponieważ zamieni to zapytanie w połączenie INNER;
  3. GROUP BY i HAVING zdanie;
  4. kombinacje zapytania: UNION, INTERSECT, EXCEPT lub MINUS
  5. ORDER BY
  6. LIMIT

Dlatego, jak inni wskazał, to syntatically źle używać ORDER BY i LIMITprzedUNION klauzuli. Powinieneś użyć podkwerend:

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; 
Powiązane problemy