これを「より単純な」SQLに書き直す方法は次のとおりです。
SELECT tab1.ScenarioID,
tab1.TradeID,
tab1.Value AS Val1,
tab2.Value,
AS Val2,
tab2.Value - tab1.Value
FROM (SELECT ScenarioID,
TradeID,
FileName,
Value,
Change
FROM CalypsoResults
WHERE FileName = 'x'
AND Date = '2012-05-17') tab1
LEFT JOIN (SELECT ScenarioID,
TradeID,
FileName,
Value,
Change
FROM CalypsoResults
WHERE FileName = 'x'
AND Date = '2012-05-18') tab2
ON tab1.ScenarioID = tab2.ScenarioID
AND tab1.ID = tab2.ID
これを試しましたが、同じ結果が得られません:
SELECT a.ScenarioID,
a.ID,
a.Date,
a.Value AS Val1,
b.Value AS Val2,
b.Value - a.Value AS Change
FROM CalypsoResults a
LEFT JOIN CalypsoResults b
ON a.ScenarioID = b.ScenarioID
AND a.ID = b.ID
AND a.FileName = B.FileName
WHERE a.Date = '2012-05-17'
AND ( b.Date = '2012-05-18'
OR b.Date IS NULL )
AND a.FileName = 'x'
2 つ目は、a には行があるが b には行がないインスタンスを見逃しています。