【发布时间】: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