【问题标题】:INNER JOIN with condition on a column - Efficient wayINNER JOIN 与列上的条件 - 有效的方式
【发布时间】:2014-12-21 07:01:06
【问题描述】:

我有 2 张桌子:

Service_BD:

LOB:

我现在需要删除 LOB 表中的冗余列,如行业 ID 等,并使用 Service_BD 表来获取行业 ID 的 LOB,然后使用 LOB 表获取特定 LOB 的详细信息。

我正在尝试使用 Inner Joins 获取单个 SQL 查询,但结果很奇怪。

当我像这样运行一个简单的 SQL 查询时:

SELECT industryId, LobId 
FROM Service_BD 
WHERE industryId = 'I01' 
GROUP BY lobId

结果为 9 行:

现在,我想加入其余的 LOB 列(当然要减去已删除的列)以从中获取 LOB 详细信息。所以我使用以下查询:

SELECT * 
FROM LOB 
INNER JOIN Service_BD ON Service_BD.lobId = LOB.lobId 
WHERE Service_BD.industryId = 'I01' 
GROUP BY Service_BD.lobID

我得到了想要的结果,但我怀疑这是否是最有效的方法。我怀疑是因为Service_BD和LOB表都有大量数据,但是我感觉如果先执行GROUP BY Service_BD.lobID会降低WHERE条件的时间复杂度。

只是想知道这是否是编写查询的正确方法,还是有更好的方法来做同样的事情。

【问题讨论】:

  • 您的查询是正确的。为了稍微加快速度,您可以做的一件事是在JOIN 子句中移动WHERE 条件,例如INNER JOIN Service_DB ON ServiceDB.lobID = LOB.lobID AND Service_DB.IndustryId='I01'。但这可能取决于您使用的 RDBMS,我没有看到它在任何地方提及。
  • 由于查询包含 SELECT 子句中未在 GROUP BY 子句中提及的列,我猜是 MySQL - AFAIK 没有其他 RDBMS 也有这个奇怪的“功能”。
  • @FrankSchmitt:如果lobID 是主键(或唯一键),它实际上是有效的(标准)SQL 并且也适用于 Postgres:stackoverflow.com/q/27561914/330315
  • 是的,它是 MySQL,lobId 是主键。
  • @a_horse_with_no_name 。 . . lobID 不是主键,因为它有重复的值。不过,您的观点是普遍的。它不仅在 Postgres 中有效,而且在这种情况下也可以被标准所接受。

标签: mysql sql join inner-join


【解决方案1】:

您没有提到您使用的是哪个数据库引擎,所以我猜您使用的是 MySQL。 In most cases GROUP BY 将仅在满足 WHERE 条件的行上执行。所以GROUP BY 只对INNER JOIN 和WHERE 子句的获取结果执行。

我不认为

SELECT * 
FROM LOB INNER 
JOIN Service_BD ON Service_BD.lobId = LOB.lobId 
WHERE Service_BD.industryId = 'I01' 
GROUP BY Service_BD.lobID

提高了查询的性能,但它肯定会从结果中消除重复的lobID。此外,除了引入 HAVING 子句之外,我没有看到任何其他更好的消除重复项的方法,但我认为它不会提高查询的性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-15
    • 2013-01-31
    • 1970-01-01
    • 2017-05-07
    • 1970-01-01
    • 2013-12-10
    • 2012-04-04
    • 2013-07-19
    相关资源
    最近更新 更多