[英]How do I do a SQL JOIN on 3 tables?
我正在使用MySQL,并且试图从三个不同的表中获取数据,但是不确定应该使用的语法。
我有一个名为full_daily_data_1的表,其中包含以下字段Symbol Trade_Date Day_Open Day_High
我还有一个名为custom_indices_xref的表,其中包含以下字段:符号Custom_Index_Name
还有一个名为daily_index_weightings的表,其中包含以下字段:Custom_Index_Name符号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符号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 ;
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'
您的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')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.