我有以下数据库表
User List
------ ------
userId (PK) listId (PK)
fullName description
addedById (FK with userId in User table)
modifiedById (FK with userId in User table)
我需要从列表中提取所有数据,但不是显示 addedById 和 modifiedById 的ID,而是需要从用户表中提取 fullName 。
此查询有效,并为我提供了所需的数据。但是,我不确定是否有更好的方法来构建此查询?我并不热衷于在主要选择查询中使用多个子选择查询,主要是因为性能问题。
select t1.[description],
t1.addedById,
t1.modifiedById,
(select fullName from dbo.User where userId = t1.addedById) as [AddedByUser],
(select fullName from dbo.User where userId = t1.modifiedById) as [ModifiedByUser]
from dbo.List t1
如果有人可以建议改进查询,或者建议保持原样,我真的很感激。
感谢。
答案 0 :(得分:1)
更标准的SQL方法是:
SELECT t1.description,
t1.addedById,
t1.modifiedById,
add.fullName AS [AddedByUser],
mod.fullName AS [ModifiedByUser]
FROM dbo.List t1
LEFT JOIN dbo.User add
ON add.userId = t1.addedById
LEFT JOIN dbo.User mod
ON mod.userID = t1.modifiedById
但是,我怀疑这将与您的查询完全相同,并且可能具有相同的执行计划。这种方法唯一真正的优点是它更容易扩展。例如,如果要从User表中添加新列,这将更容易。
正如@Gordon所说,如果您加入的字段有索引,那么表现应该没问题。
答案 1 :(得分:1)
这个双重连接是否同桌困扰你?它不是很慢,而是做出链接子查询的首选方式。
我假设你有PK和两个FK的索引。
只有最小化的是减少连接行的数量。你可以做到这一点 通过使用左内连接或最后使用where子句进行过滤,声明在连接中使用的两个键必须不为空
我可以为你写两个例子,但这应该是自我解释的。
您可以做的其他市长事情是预先设定用户的价值观。例如,如果您有大量用户,并且您知道其中只有少数用户可以担任这两种用户。您可以按照您尚未列出的用户的某些列过滤哪些列,如果该列包含索引,则会更好。
然后,您可以从预先选择那些用户然后加入选择结果中获益。如果两者都可以预先选择,或者通过现场选择而不是连接到整个表,则可以通过临时表。不确定我们在这里处理的数字是否相关..