【问题标题】:rewrite statement with JOIN clause用 JOIN 子句重写语句
【发布时间】:2026-02-23 06:15:02
【问题描述】:

我必须在目录中找到所有 id = 101 的提供者拥有的所有汽车部件的提供者的名称,使用 JOIN 子句。输出中不需要提供者 id = 101。

'Providers' 是第一个包含 id 和 nameProvider 的表。 'Catalog' 是包含 id 和 idp(汽车零件 ID)的第二个表

查询:

 select nameProvider
from Providers p
where p.id != 101
and not exists ( 
  select  idp from Catalog c1 where c1.id = 101 
    minus 
  select  idp from Catalog c2 where c2.id = p.id
  )
;

我该如何重写它?

【问题讨论】:

  • NOT EXISTS 可以重写为反连接。我喜欢NOT EXISTS 比反连接好得多,但也许这就是任务。另一种选择是CROSS JOIN all 101 部分与所有提供者,然后LEFT OUTER JOIN 他们的真实部分,看看你是否有每个 101 部分的匹配项(COUNT(*) vs. COUNT(own part)`)。
  • 注意:JOIN是一个操作符,不是一个子句。

标签: mysql sql join inner-join


【解决方案1】:

您可以很容易地使用left join 和聚合来获取提供者 ID:

select p.id, p.nameProvider
from catalog c join
     provider p
     on c.id = 101 and p.id <> 101 left join
     catalog c2
     on c2.idp = c.idp
group by p.id, p.nameProvider
having count(*) = count(c2.idp);

这基本上表示所有部件的 id 都匹配。

【讨论】: