SQL选择子查询

SQL选择子查询,sql,sql-server,select,subquery,Sql,Sql Server,Select,Subquery,我有以下数据库表 User List ------ ------ userId (PK) listId (PK) fullName description addedById (FK with userId in User table) modifiedById (FK with userId in User table) 我需要从列表表中取出所有数据,但我需要从用户表中取出全名,而不是显示a

我有以下数据库表

User          List
------        ------
userId (PK)   listId (PK)
fullName      description
              addedById (FK with userId in User table)
              modifiedById (FK with userId in User table)
我需要从列表表中取出所有数据,但我需要从用户表中取出全名,而不是显示addedByIdmodifiedById的ID

这个查询有效,并提供我需要的数据。但是,我不确定是否有更好的方法来构造这个查询?我不喜欢在主选择查询中有多个子选择查询,主要是因为性能问题

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
如果有人能建议对查询进行改进,或建议保持原样,我将不胜感激


谢谢。

更标准的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
但是,我怀疑这将与您的查询执行相同,并且可能具有相同的执行计划。这种方法的唯一真正优点是易于扩展。例如,如果您想从用户表中添加新列,这将更容易


正如@Gordon所指出的,如果在您要加入的字段上有一个索引,那么性能应该很好。

更标准的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
但是,我怀疑这将与您的查询执行相同,并且可能具有相同的执行计划。这种方法的唯一真正优点是易于扩展。例如,如果您想从用户表中添加新列,这将更容易


正如@Gordon所指出的,如果在您要加入的字段上有索引,那么性能应该是良好的。

对同一个表的双重加入会困扰您吗?它并不慢,它的首选方式是创建链接子查询

我假设你在PK和FK上都有索引

唯一可以最小化的是减少连接行的数量。你能做到的 通过使用左内部联接或在结尾处使用where子句进行筛选,说明在联接中使用的两个键必须不为null

我可以为你写两个例子,但这应该是不言自明的

您可以做的另一件事是从用户处预选值。例如,如果你有一大堆用户,你知道他们中只有很少的人可以担任任何一个角色。你可以根据你没有列出的用户中的某一列来过滤哪些用户,如果该列有索引的话,效果会更好


然后,您可能会从只预先选择这些用户,然后加入到选择结果中获益。通过临时表格(如果两者都可以预先选择)或通过现场选择而不是连接到整个表格。不确定我们在这里处理的数字是否与此相关。

使用同一个表的双连接是否困扰您?它并不慢,它的首选方式是创建链接子查询

我假设你在PK和FK上都有索引

唯一可以最小化的是减少连接行的数量。你能做到的 通过使用左内部联接或在结尾处使用where子句进行筛选,说明在联接中使用的两个键必须不为null

我可以为你写两个例子,但这应该是不言自明的

您可以做的另一件事是从用户处预选值。例如,如果你有一大堆用户,你知道他们中只有很少的人可以担任任何一个角色。你可以根据你没有列出的用户中的某一列来过滤哪些用户,如果该列有索引的话,效果会更好


然后,您可能会从只预先选择这些用户,然后加入到选择结果中获益。通过临时表格(如果两者都可以预先选择)或通过现场选择而不是连接到整个表格。不确定我们在这里处理的数字是否与此相关。

改为使用左连接。假设
用户ID上有索引,您的查询就可以了。另一种方法是左连接。这两种方法的性能都应该非常相似。因此,这是一种离题的方法。我建议在CodeReview上发布。为什么这个问题会被否决?请改为左加入。假设
userId
上有索引,您的查询就可以了。另一种方法是左连接。这两种方法的性能都应该非常相似。因此,这是一种离题的方法。我建议在CodeReview上发布。为什么这个问题会被否决?这个替代方法非常有用。我加入的字段有索引,我没有注意到这两种方法有什么不同。这种替代方法非常有用。我加入的字段上有索引,我没有注意到这两种方法有任何区别。