2010-11-05 113 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