Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 克服;“至少一次”;左连接中的条件_Mysql_Join_Query Optimization_Left Join - Fatal编程技术网

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)