SQLite - объединение двух подзапросов - PullRequest
3 голосов
/ 06 ноября 2010

Или, по крайней мере, я думаю, что они называются подзапросами (новичкам и самообучающимся в SQLite).У меня есть два SELECT заявления из двух таблиц в одной базе данных.Я хотел бы объединить эти два подзапроса вдоль столбцов date и symbol.Подзапросы отлично работают отдельно, но когда я пытаюсь JOIN, я получаю сообщение об ошибке (error in statement: near "JOIN": syntax error).Вот моя строка запроса:

SELECT date, symbol, SUM(oi*contract_settle) AS oi_dollar
    FROM (SELECT date, symbol, oi, contract_settle
            FROM ann
            UNION
            SELECT date, symbol, oi, contract_settle
            FROM qtr) 
    GROUP BY date, symbol
    HAVING oi_dollar > 0
    JOIN
    (SELECT date, symbol, ret FROM crsp
    USING (date, symbol))

Спасибо!

Ответы [ 2 ]

13 голосов
/ 06 ноября 2010

Ваше предложение JOIN должно быть перед предложением GROUP BY.Кроме того, я знаю, что sqlite имеет несколько различных «необязательных» синтаксисов для объединений, но должен работать следующий более стандартный запрос:

SELECT a.date, a.symbol, SUM(a.oi * a.contract_settle) AS oi_dollar
FROM (SELECT date, symbol, oi, contract_settle
        FROM ann
        UNION
        SELECT date, symbol, oi, contract_settle
        FROM qtr) a
INNER JOIN crsp c ON a.date = c.date AND a.symbol = c.symbol
WHERE a.oi * a.contract_settle > 0
GROUP BY a.date, a.symbol

Если вы немного больше знаете о столбцах oi и contract_settle (например,они никогда не могут быть отрицательными), предложение WHERE a.oi <> 0 AND a.contract_settle <> 0 может иметь лучшую производительность.

1 голос
/ 06 ноября 2010

Вы должны определить, как вы присоединяетесь к предложению on.Я не знаю о SQLite, но в SQL это будет выглядеть так (может не работать):

SELECT date, symbol, SUM(oi*contract_settle) AS oi_dollar
    FROM (SELECT date, symbol, oi, contract_settle
            FROM ann
            UNION
            SELECT date, symbol, oi, contract_settle
            FROM qtr) as 'a'
    JOIN
    (SELECT date, symbol, ret FROM crsp
    USING (date, symbol)) as 'b'
    ON a.date = b.date AND a.symbol = b.symbol
    GROUP BY date, symbol
    HAVING oi_dollar > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...