编写此查询的更好方法

Posted

技术标签:

【中文标题】编写此查询的更好方法【英文标题】:Better way of writing this query 【发布时间】:2014-07-21 20:20:52 【问题描述】:

我想知道是否可以用一个连接替换下面的内容并减少对整个选择周围的 ISNULL 的需求?

SELECT ISNULL(
(
 SELECT Locale FROM Users WHERE UserGuid = @UserGuid),
 (SELECT Locale FROM Companies WHERE CompanyGuid = 
   (SELECT CompanyGuid FROM UserCompany WHERE UserGuid = @UserGuid)
 ))

【问题讨论】:

【参考方案1】:

我认为这将是等效的:

SELECT ISNULL(u.Locale, c.Locale)
FROM Companies c
INNER JOIN UserCompany uc ON c.CompanyGuid = uc.CompanyGuid
LEFT OUTER JOIN Users u ON uc.UserGuid = u.UserGuid
WHERE uc.UserGuid = @UserGuid

注意:这假设 UserGuid 在 Users 和 UserCompany 中是唯一的。

【讨论】:

我能看到的唯一真正区别是 OP 的查询将始终返回一行,即使 @UserGuid 与任一表中的任何内容都不匹配。这是否重要,甚至相关,我们很难说......

以上是关于编写此查询的更好方法的主要内容,如果未能解决你的问题,请参考以下文章

在 VIEW 中编写此特定 SELECT 查询的更好方法

子选择或连接?有没有更好的方法来编写这个 mysql 查询?

有没有更好的方法来编写这个查询

编写此程序的更好方法,以便它消耗最少的时间来执行

有没有更好的方法可以使用 dexie 在 svelte 中编写此代码?

在此查询中获取数据计数的更好方法? [复制]