如何将此SQL转换为更具可读性的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
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
检查以获得相同的结果。