SQL:帮助嵌套查询

Posted

技术标签:

【中文标题】SQL:帮助嵌套查询【英文标题】:SQL: Help with a nested queries 【发布时间】:2011-01-19 06:30:43 【问题描述】:

这是我的架构:

供应商(sid:整数,sname:字符串,地址字符串)

零件(pid:整数, pname:字符串,颜色:字符串)

目录(sid: integer, pid: integer, cost: real)

粗体表示主键。

我想编写一个查询来查找提供每个零件的所有供应商。这里有两个我已经问过的问题:

-- get all parts for a given supplier
SELECT Parts.pid
FROM Suppliers
JOIN Catalog ON Catalog.sid = Suppliers.sid
JOIN Parts ON Parts.pid = Catalog.pid
WHERE Suppliers.sid = 4;

-- gets all parts that exist
SELECT Parts.pid
FROM Parts

我想要做的,用命令式的术语来说,是这样的:

Define result set
Foreach Supplier:
    If the list of parts produced by a supplier 
    is equal to the total list of parts, add this supplier to the result set
Return result set

我怎样才能把它翻译成 mysql

【问题讨论】:

我打算建议研究 UNION 和 MINUS... 然后我记得 MySQL 不支持 MINUS 所以你必须找到一种方法来伪造它(并且有 are 方式)。但总的来说,我会说,如果您从ALL PARTS 列表中减去供应商的零件列表,并且您还有剩余的东西,那么该供应商不会提供所有零件。 【参考方案1】:

用途:

SELECT s.*
  FROM SUPPLIER s
  JOIN (SELECT c.sid,
               COUNT(c.pid) AS num_parts
          FROM CATALOG c
      GROUP BY c.sid) x ON x.sid = s.sid
  JOIN (SELECT COUNT(*) AS total_parts
          FROM PARTS) y ON y.total_parts = x.num_parts

【讨论】:

【参考方案2】:

不确定它是如何转换为 MySQL 的,但大致如下:

select s.sname, PartCount from (
 select s.SID, s.sname, PartCount = sum(p.PID)
 inner join Catalog c on c.SID = s.SID
 inner join Parts p on p.PID = c.PID
 where s.SID = 4
 group by s.SID
) a
where PartCount = MAX(PartCount)

注意,将子查询标记为“a”是一个任意名称,因为 MSSQL 出于某种原因需要其子查询上的名称。不知道它在 MySQL 中是如何工作的。

【讨论】:

【参考方案3】:

尝试(未经测试):

SELECT s.*
FROM (
  SELECT sid, count(pid) as c
  FROM Catalog
  GROUP BY sid) q1
JOIN Suppliers s ON s.sid = q1.sid
WHERE q1.c = (SELECT COUNT(*) FROM Parts)

【讨论】:

【参考方案4】:

试试:

SELECT Suppliers.sid
FROM Suppliers
INNER JOIN
(SELECT sid, COUNT(pid) as num
    FROM Catalog
    GROUP BY sid)as t1
ON Suppliers.sid = t1.sid
WHERE t1.num = 
    (SELECT COUNT(pid) FROM Parts)

【讨论】:

以上是关于SQL:帮助嵌套查询的主要内容,如果未能解决你的问题,请参考以下文章

从 Excel VBA 运行嵌套的 Access SQL 查询

在sql中对不相关嵌套查询的处理原则

标准SQL嵌套查询语句

SQL语句 - 嵌套查询

SQL语句 - 嵌套查询

SQL 查询 嵌套 FROM HAVING