0

我正在使用 MySQL,我试图从三个不同的表中获取数据,但不确定我应该使用的语法。

我有一个名为 full_daily_data_1 的表,其中包含以下字段 Symbol Trade_Date Day_Open Day_High

我还有一个名为 custom_indices_xref 的表,其中包含以下字段:符号 Custom_Index_Name

还有一个名为 daily_index_weightings 的表,其中包含以下字段: Custom_Index_Name Symbol Trade_date combo_weighting

现在,我把它作为一个选择语句来从两个表中获取我需要的数据:

SELECT 
    Symbol, 
    Trade_Date, 
    Day_Open, 
    Day_High
FROM 
    full_daily_data_1 
WHERE 
    trade_date >= '2012/01/01' AND
    trade_date <= '2012/01/31' AND 
    symbol in (SELECT symbol from custom_indices_xref WHERE Custom_Index_Name = 'Agricultural-Chemical-and-Fertilizer-Stocks');

但我想要的是日期范围符号 Day_Open Day_High, Custom_Index_Name Symbol Trade_date combo_weighting 中每个日期的每个符号的以下数据

所以基本上,需要从daily_index_weightings 表中为选定的日期和符号添加combo_weighting。我的 SQL 语句应该是什么样子才能完成这个?

我试过这个,但我得到一个 SQL 语法错误,所以不确定我做错了什么:

SELECT 
    full_daily_data_1.Symbol, 
    full_daily_data_1.Trade_Date,
    full_daily_data_1.Day_Open, 
    full_daily_data_1.Day_High,
    full_daily_data_1.Day_Low,
    daily_index_weightings.combo_weighting
FROM 
    full_daily_data_1
WHERE 
    trade_date >= '2012/01/01' AND  
    trade_date <= '2012/01/31' AND 
    Symbol in (SELECT symbol from custom_indices_xref WHERE Custom_Index_Name = 'Agricultural-Chemical-and-Fertilizer-Stocks')
JOIN 
    daily_index_weightings ON 
        daily_index_weightings.symbol = full_daily_data_1.Symbol AND 
        daily_index_weightings.Trade_Date = full_daily_data_1.Trade_Date ; 
4

2 回答 2

0
 SELECT fdd.Symbol, fdd.Trade_Date, fdd.Day_Open, fdd.Day_High, fdd.Day_Low, diw.combo_weighting 
 FROM full_daily_data_1 fdd 
 INNER JOIN custom_indicies_xref cix ON fdd.symbol=cix.symbol 
 INNER JOIN daily_index_weighings diw ON fdd.symbol = diw.symbol
 WHERE 
 trade_date >= '2012/01/01' AND  
 trade_date <= '2012/01/31' AND 
 cix.Custom_Index_Name = 'Agricultural-Chemical-and-Fertilizer-Stocks'

如果需要,可以将 INNER JOINS 更改为 LEFT JOIN。

或者,由于您的第二个和第三个表也匹配 Custom_Index_Name 字段(顺便说一句,这是糟糕的设计):

 SELECT fdd.Symbol, fdd.Trade_Date, fdd.Day_Open, fdd.Day_High, fdd.Day_Low, diw.combo_weighting  
 FROM full_daily_data_1 fdd 
 INNER JOIN (custom_indicies_xref cix ON fdd.symbol=cix.symbol 
      INNER JOIN daily_index_weighings diw ON cix.Custom_Index_Name = diw.Custom_Index_Name)
 ON fdd.symbol = cix.symbol
 WHERE 
 trade_date >= '2012/01/01' AND  
 trade_date <= '2012/01/31' AND 
 cix.Custom_Index_Name = 'Agricultural-Chemical-and-Fertilizer-Stocks'
于 2013-04-17T20:50:42.600 回答
0

您的 sql 子句是乱序的,您应该为表名使用别名,这样更容易阅读。我注意到的另一件事是您在 WHERE 子句中的字段不明确。

SELECT 
    FDD.Symbol, 
    FDD.Trade_Date,
    FDD.Day_Open, 
    FDD.Day_High,
    FDD.Day_Low,
    DIW.combo_weighting
FROM 
    full_daily_data_1 FDD
JOIN 
    daily_index_weightings DIW ON 
        DIW.symbol = FDD.Symbol AND 
        DIW.Trade_Date = FDD.Trade_Date ; 
WHERE 
    FDD.trade_date >= '2012/01/01' AND  
    FDD.trade_date <= '2012/01/31' AND 
    FDD.Symbol in 
    (SELECT symbol from custom_indices_xref WHERE Custom_Index_Name = 'Agricultural-Chemical-and-Fertilizer-Stocks')
于 2013-04-17T20:59:18.733 回答