Sql 由于性能不佳,左侧外部联接需要改进

Sql 由于性能不佳,左侧外部联接需要改进,sql,left-join,outer-join,Sql,Left Join,Outer Join,我有一个表,它有一个名称列和3个标识符,这些标识符引用同一个表中的其他条目。我需要一个查询,将这3个标识符解析为它们所引用的记录的实际名称。到目前为止,我只做到了以下几点 SELECT mt.Name, mt2.Name, mt3.Name, mt4.Name FROM MyTable AS mt1 LEFT OUTER JOIN MyTable AS mt2 ON mt2.Id = mt1.RefId1 LEFT OUTER JOIN MyTable AS mt3 ON mt3.Id = m

我有一个表,它有一个名称列和3个标识符,这些标识符引用同一个表中的其他条目。我需要一个查询,将这3个标识符解析为它们所引用的记录的实际名称。到目前为止,我只做到了以下几点

SELECT mt.Name, mt2.Name, mt3.Name, mt4.Name 
FROM MyTable AS mt1
LEFT OUTER JOIN MyTable AS mt2 ON mt2.Id = mt1.RefId1
LEFT OUTER JOIN MyTable AS mt3 ON mt3.Id = mt1.RefId2
LEFT OUTER JOIN MyTable AS mt4 ON mt4.Id = mt1.RefId3

…它起作用并返回三个引用记录的名称。请注意,在某些情况下,RefId1/2/3值可能为空,因此并非总是使用所有RefId字段。它可以工作,但速度不是很快,我相信真正了解SQL的人可以显著改进这一点。有什么想法吗?

为了改进您的查询,您可以使用内部联接而不是左外部联接。如果我正确理解您的评论,mt2、mt3或mt4将返回一个值

因此,一个有效的查询可以这样编写。这可以确保一旦找到匹配项,它就停止向前看

SELECT mt.Name, mt2.Name
FROM MyTable mt, MyTable mt2
WHERE mt2.id = mt.RefId1
OR mt2.id = mt.RefId2
OR mt2.id = mt.RefId3

让我知道这是否有效。

您试过表了吗?

ID是否可以对应多个RefId?执行计划是什么样子的?每个RefId列在表中都有索引吗?RefId1/2/3永远不会指向同一个其他记录。它们将始终为空或指向唯一的记录。目前唯一的索引是MyTable.Id列。所有三个RefId字段都可能指向不同的记录,因此我可能需要收回所有三个名称。好的,在这种情况下,您只需将查询中的左外部联接替换为内部联接即可。内部联接的工作原理是与结果集相交,因此您应该可以这样做。不幸的是,如果任何交点为空,则内部联接将忽略行,因此您需要在所有refid上添加空检查。我正试图找到一个解决办法,并将更新答案,或将回复的评论,一旦我发现一些东西。