如何将此SQL转换为更具可读性的SQL?

如何将此SQL转换为更具可读性的SQL?,sql,sql-server,Sql,Sql Server,如何将其重新写入“更简单”的SQL: 我试过了,但没有得到同样的结果: 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

如何将其重新写入“更简单”的SQL:

我试过了,但没有得到同样的结果:

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' 
第二个是遗漏了a中有行而b中没有行的实例。

将表的第二个实例的所有谓词放入
连接中,而不是
其中的

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'
另外,您在第二个版本中加入了
FileName
,但在第一个版本中没有加入。

将表的第二个实例的所有谓词放入
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'

另外,在第二个版本中,您是在
FileName
上加入的,而不是在第一个版本中。

这是
OUTER-JOIN
s的一般模式-在可能的情况下,始终将与内部表相关的谓词放在它的
JOIN
子句中,而不是放在父查询的
where
子句中。可以在
WHERE
中执行此操作,但您必须在所有不同的场景中绞尽脑汁,设置
NULL
检查以获得相同的结果。这是
OUTER JOIN
s的一般模式-在可能的情况下,始终将与内部表相关的谓词放在它的
JOIN
子句上,不在父查询的
WHERE
子句中。可以在
的WHERE
中执行此操作,但您必须对所有不同的场景进行仔细思考,并正确设置
NULL
检查以获得相同的结果。