Mysql 列有效方法上带条件的内连接

Mysql 列有效方法上带条件的内连接,mysql,sql,join,inner-join,Mysql,Sql,Join,Inner Join,我有两张桌子: 服务单位: LOB: 我现在需要删除LOB表中的冗余列,如industryId等,并使用Service_BD table获取industryId的LOB,然后使用LOB table获取特定LOB的详细信息 我尝试使用内部联接获取单个SQL查询,但结果很奇怪 当我运行这样一个简单的SQL查询时: SELECT industryId, LobId FROM Service_BD WHERE industryId = 'I01' GROUP BY lobId 结果为9行:

我有两张桌子:

服务单位:

LOB:

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

我尝试使用内部联接获取单个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表都有大量的数据,但我感觉如果先执行
groupby Service_BD.lobID
,将降低
WHERE
条件的时间复杂性


我只是想知道这是否是编写查询的正确方法,或者是否有更好的方法来编写查询。

您没有提到您使用的是哪个数据库引擎,所以我猜您使用的是MySQL。
分组依据
将仅在满足
WHERE
条件的行上执行。因此,
groupby
仅对
内部联接
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
子句之外,我没有发现其他更好的方法来消除重复项,但我认为这不会提高查询的性能。

您的查询是正确的。要稍微加快速度,可以做的一件事是移动
JOIN
子句中的
WHERE
条件,例如ServiceDB.lobID=LOB.lobID上的
internal JOIN Service\u DB和Service\u DB.IndustryId='I01'
。但这可能取决于您正在使用的RDBMS,我看不到它在任何地方都会出现。由于查询在SELECT子句中包含GROUP BY子句中未提及的列,我猜它是MySQL-AFAIK,没有其他RDBMS也有这种奇怪的“特性”。@FrankSchmitt:if
lobID
是主键(或唯一键),它实际上是有效的(标准)SQL,也适用于Postgres:是的,它是MySQL,lobId是主键。@a_horse_和_no_name
lobID
不是主键,因为它有重复的值。你的观点大体上是正确的。它不仅适用于博士后,而且在这种情况下,它是被标准所接受的。