我正在修改一个现有语句,该语句连接一个表中的用户信息,以便用户信息可以来自另一个表。一个是永久表,另一个是临时表(记录从一个表移动到另一个表)。我将连接更改为左连接,然后左连接第二个联系人info表。如果永久字段存在,则需要选择永久字段;如果永久字段不存在,则需要选择临时字段。154306是我从中选择的主表上所有传入记录的用户id。以下是我选择字段的两个选项:
SELECT
CASE WHEN U.USRID = 154306
THEN T.TMPFNAME
ELSE U.FNAME
END AS FNAME,
COALESCE (U.LNAME, T.TMPLNAME) AS LNAME
FROM FILES.ORDERS O
LEFT JOIN FILES.USERS U ON U.USRID <> 154306 AND U.USRID = O.ORDUSR
LEFT JOIN FILES.TMPUSERS T ON O.ORDNUM = T.TMPORD我认为这种情况看起来更“正确”,因为它实际上是在控制流程,但由于coalesce遵循的逻辑较少,它可能会执行得更快。任何一个都应该实现相同的结果,因为两个左连接确保我们无论如何都会获得用户的信息,但不会获得仍然分配给临时用户的订单的永久用户信息。看起来我们有10个字段要合并,所以我认为性能更好的方法是可行的,我认为是合并,但我甚至不确定这一点。出于任何原因,哪一种方式更好?
发布于 2013-05-18 01:25:04
对于连接三个大表的查询,case和coalesce()的性能不会有什么不同。这样的查询主要取决于读取和匹配表中的行的时间。
顺便说一句,这两者并不完全相同。如果您在users.Fname中有NULL值,那么case逻辑将保留这些值,但是coalesce()逻辑将填充来自另一个表的值。
你的标准应该是表达的清晰度。因为您认为case更有意义,所以我建议您使用它。
https://stackoverflow.com/questions/16613689
复制相似问题