Mysql 克服;“至少一次”;左连接中的条件
我有以下两个表Mysql 克服;“至少一次”;左连接中的条件,mysql,join,query-optimization,left-join,Mysql,Join,Query Optimization,Left Join,我有以下两个表报价(日期、市场、股票代码、收盘)和场景(日期1、日期2、期间、市场、股票代码、比率)。我编写了以下左连接查询,除了一个问题外,它满足了我的要求: SELECT S.date1 AS date1, S.date2 AS date2, S.period AS period, Q.market AS market, Q.ticker AS ticker, Q.close * EXP(S.ratio) A
报价(日期、市场、股票代码、收盘)
和场景(日期1、日期2、期间、市场、股票代码、比率)
。我编写了以下左连接查询,除了一个问题外,它满足了我的要求:
SELECT S.date1 AS date1,
S.date2 AS date2,
S.period AS period,
Q.market AS market,
Q.ticker AS ticker,
Q.close * EXP(S.ratio) AS scenario
FROM portfolio.quote Q LEFT JOIN portfolio.scenario S
ON Q.market = S.market AND
Q.ticker = S.ticker AND
S.date1 >= '2010-06-01' AND
S.date2 <= '2010-07-01' AND
S.period = 'WEEK'
WHERE Q.date = '2010-07-01'
ORDER BY S.date1, S.date2, S.period, Q.market, Q.ticker
在“2010-06-01”和“2010-07-01”之间的“周”期间(“sp500”、“QEP”)可能有许多不匹配的行,但只有一行在属于场景表的列中用空值表示此事实。更不用说,在这些结果中(market、ticker)有许多不匹配的行,但至少存在一个匹配项,因此查询不会为这些行返回NULL值
我想做的是,例如,如果Q.date='2010-07-01'为quote表返回500行,那么将有500*(不同的date1、date、period)。仅当以下条件不匹配时,场景列中才显示空值:
Q.market = S.market AND
Q.ticker = S.ticker
例如,空结果将如下所示:
date1 , date2 , period , market , ticker, scenario
'2010-06-01' , '2010-06-08' , 'WEEK' , 'sp500', 'QEP' , NULL
'2010-06-08' , '2010-06-15' , 'WEEK' , 'sp500', 'QEP' , NULL
'2010-06-15' , '2010-06-23' , 'WEEK' , 'sp500', 'A' , NULL
另一个例子是,如果与报价表中的(市场、行情、收盘)
行匹配Q.date='2010-07-01'
,则为:
('sp','A',1)
('sp','AA',2)
以及符合条件的(date1、date2、period、market、ticker、ratio)
行
S.date1 >= '2010-06-01' AND
S.date2 <= '2010-07-01' AND
S.period = 'WEEK'
然后我的查询结果应该返回
('2010-06-01','2010-06-08','WEEK','sp','A',1*EXP(0.43))
('2010-06-01','2010-06-08','WEEK','sp','AA',2*EXP(0.21))
('2010-06-08','2010-06-20','WEEK','sp','A',1*EXP(0.49))
('2010-06-08','2010-06-20','WEEK','sp','AA',NULL)
('2010-06-20','2010-06-27','WEEK','sp','A',1*EXP(0.46))
('2010-06-20','2010-06-27','WEEK','sp','AA',NULL)
这种事情在MySQL中可能发生吗?非常感谢您的帮助:)因为您使用的是左连接,所以即使在ON条件与其他表(场景)不完全匹配的情况下,也会显示FROM表的(quote)行。其他表中的列仅替换为NULL 然而,您一直想做的是显示scenario表中的所有行,而不是quote表中的所有行。因此,我建议您使用RIGHT join或将查询部分替换为
FROM portfolio.scenario S LEFT JOIN portfolio.quote Q
希望这能解决您的问题。因为您使用的是左联接,所以即使在ON条件与其他表(场景)不完全匹配时,也会显示FROM表的(quote)行。其他表中的列仅替换为NULL 然而,您一直想做的是显示scenario表中的所有行,而不是quote表中的所有行。因此,我建议您使用RIGHT join或将查询部分替换为
FROM portfolio.scenario S LEFT JOIN portfolio.quote Q
希望这能解决您的问题。Thanx很想得到您的反馈,但实际上我不想显示scenario表中的所有行,而不是quote表中的所有行。我将用一个例子重新编辑我的问题来说明我的观点。Thanx很想得到你们的反馈,但实际上我不想显示scenario表中的所有行,而不是quote表中的所有行。我将用一个例子重新编辑我的问题来说明我的观点。
('2010-06-01','2010-06-08','WEEK','sp','A',0.43)
('2010-06-01','2010-06-08','WEEK','sp','AA',0.21)
('2010-06-08','2010-06-20','WEEK','sp','A',0.49)
('2010-06-20','2010-06-27','WEEK','sp','A',0.46)
('2010-06-20','2010-06-27','WEEK','sp','B',0.23)
('2010-06-01','2010-06-08','WEEK','sp','A',1*EXP(0.43))
('2010-06-01','2010-06-08','WEEK','sp','AA',2*EXP(0.21))
('2010-06-08','2010-06-20','WEEK','sp','A',1*EXP(0.49))
('2010-06-08','2010-06-20','WEEK','sp','AA',NULL)
('2010-06-20','2010-06-27','WEEK','sp','A',1*EXP(0.46))
('2010-06-20','2010-06-27','WEEK','sp','AA',NULL)