2015-07-11 2 views
1

Я пытаюсь повторно использовать таблицу в SQLite. Моя попытка выглядит следующим образом:Как повторно использовать таблицу с UNION?

SELECT 
    Partials.e_sentence 
FROM 
     (SELECT 
      e_sentence, _id 
     FROM 
      Pair 
       JOIN PairCategories 
        ON 
         _id=PairId AND CategoryId=53 

     UNION 

     SELECT 
      e_sentence, _id 
     FROM 
      Pair 
     WHERE 
      e_sentence LIKE '%' || 'how often' || '%' 
     GROUP BY 
      e_sentence) 
    AS Parents JOIN Partials 
     ON Parents._id=ParentId 

UNION 

SELECT 
    e_sentence 
FROM 
    Parents 

Ключевая часть я пытаюсь сделать это на дне, где я пытаюсь UNION таблицы, созданная в предыдущем заявлении. Есть ли способ сделать это в SQLite, или я вынужден повторить запрос, который сделал таблицу Parents в первой половине UNION?

ответ

1

В SQLite 3.8.3 или более поздней версии, вы можете использовать common table expression:

WITH Parents AS (
    SELECT e_sentence, _id 
    FROM Pair 
    JOIN PairCategories 
    ... 
) 
SELECT Partials.e_sentence 
FROM Parents 
JOIN Partials ON Parents._id = ParentId 
UNION 
SELECT e_sentence 
FROM Parents; 

Если вы используете старую SQLite (возможно, потому, что вы используете older Android), вы можете создать view для подзапрос:

CREATE VIEW Parents AS 
    SELECT e_sentence, _id 
    FROM Pair 
    JOIN PairCategories 
    ...; 

SELECT Partials.e_sentence 
FROM Parents 
JOIN Partials ON Parents._id = ParentId 
UNION 
SELECT e_sentence 
FROM Parents; 

Если вы не хотите, чтобы этот вид постоянно в базе данных, вы можете сделать это временным (CREATE TEMPORARY VIEW ...), так что он не доступен за пределами текущего соединения с базой данных, или, как последнее средство, Эй u может просто вставить подзапрос, где бы вы ни использовали Parent:

SELECT Partials.e_sentence 
FROM (SELECT ...) AS Parents 
JOIN Partials ON Parents._id = ParentId 
UNION 
SELECT e_sentence 
FROM (SELECT ...) AS Parents; 
+0

Это именно то, что я ищу! Мне жаль, что я не смог бы начислить вам больше очков, поскольку вы спасли мне много голов. Жаль, что система вознаграждения StackOverflow способствует простым и легким ответам, в отличие от хорошо продуманных и задействованных во времени таких, как это :) –

Смежные вопросы