【问题标题】:SQL Select Sub Query [closed]SQL选择子查询[关闭]
【发布时间】:2018-04-30 02:44:06
【问题描述】:

我有以下数据库表

User          List
------        ------
userId (PK)   listId (PK)
fullName      description
              addedById (FK with userId in User table)
              modifiedById (FK with userId in User table)

我需要从 List table 中提取所有数据,但我不需要显示 addedByIdmodifiedById 的 ID,而是需要从 User 表中拉出 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

如果有人能对查询提出改进建议或建议保持原样,我将不胜感激。

谢谢。

【问题讨论】:

  • 改为使用 LEFT JOIN。
  • 您的查询没问题,假设userId 上有索引。另一种方法是LEFT JOIN。两种方法的性能应该非常相似。
  • SO 题外话。我建议在 CodeReview 上发帖。
  • 为什么这个问题会被否决?

标签: sql sql-server select subquery


【解决方案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 所说,如果您要加入的字段上有索引,则性能应该很好。

【讨论】:

  • 这种替代方法非常有用。我加入的字段上有索引,我没有注意到这两种方法有什么区别。
【解决方案2】:

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

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

唯一可以最小化的就是减少连接的行数。你可以这样做 通过使用左内连接或在最后使用 where 子句进行过滤,说明您在连接中使用的两个键都不能为空

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

您可以做的其他市长事情是预先选择用户的值。例如,如果您有大量用户,并且您知道其中只有少数人可以担任任一角色。并且您可以在未列出的用户中按某些列过滤哪些列,如果该列有索引就更好了。

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

【讨论】:

    猜你喜欢
    • 2020-09-15
    • 2014-03-17
    • 1970-01-01
    • 2019-04-04
    • 2014-06-08
    • 2015-08-01
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多