2010-11-05 49 views
2

或者至少我認爲他們被稱爲子查詢(新手和SQLite中的自我訓練)。我有兩個SELECT語句來自同一個數據庫中的兩個表。我想加入這兩個子查詢沿着列datesymbol。子查詢單獨運行良好,但是當我嘗試JOIN時出現錯誤(error in statement: near "JOIN": syntax error)。這是我的查詢字符串:SQLite - 加入兩個子查詢

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)) 

謝謝!

回答

12

你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列(比如,他們可以從來都不是負面的),a.oi <> 0 AND a.contract_settle <> 0的WHERE子句可能會有更好的表現。

+0

謝謝!這個伎倆。我希望忽略具有零'oi'或零'contract settle'的行,並且兩者都必須是非負數,所以我在查詢結束時使用了'HAVING oi_dollar> 0'。謝謝! – 2010-11-07 19:00:36

+0

謝謝你隊友救了我的一天...... :) – 2015-02-26 13:27:01

1

您需要定義如何通過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