0

これを「より単純な」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 には行がないインスタンスを見逃しています。

4

1 に答える 1

4

テーブルの2番目のインスタンスのすべての述語を、JOINではなく、に配置しWHEREます。

SELECT
    tab1.ScenarioID,
    tab1.TradeID,
    tab1.Value AS Val1,
    tab2.Value AS Val2,
    tab2.Value - tab1.Value
FROM CalypsoResults AS tab1
    LEFT JOIN CalypsoResults AS tab2 ON tab1.ScenarioID = tab2.ScenarioID
        AND tab2.FileName = 'x'
        AND tab2.Date = '2012-05-18'
        AND tab1.ID = tab2.ID
WHERE tab1.FileName = 'x'
    AND tab1.Date = '2012-05-17'

また、FileName2番目のバージョンに参加していますが、最初のバージョンには参加していません。

于 2012-05-23T10:23:00.967 に答える