0

我有一个表,它有一个 Name 列以及 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 的人可以显着改善这一点。有任何想法吗?

4

2 回答 2

1

为了改进您的查询,您可以使用 INNER JOIN 而不是 LEFT OUTER JOIN。如果我正确理解您的评论,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

让我知道这个是否奏效。

于 2013-01-30T05:44:54.883 回答
0

你试过索引你的表吗?

于 2013-01-30T06:22:38.503 回答