我有3张表如下:
s(s# int,sname nchar(10))
p(p# int,pname nchar(10))
sp(s# int,p# int)
表“s”是供应商表,“s#”是它的主键。另外表“p”是产品表,“p#”是主键。“s#”和“p#” “是表”sp“中的外键。 现在我的问题是“如何从表格中选择供应商的名称”,其中“p”表中的所有产品...
答案 0 :(得分:1)
SELECT p.*, s.sname FROM s, sp, p WHERE s.s# = sp.s# AND sp.p# = p.p#;
此声明将输出所有供应商的所有产品。 现在我们将供应商分组,并计算他们提供的产品数量:
SELECT s.sname, count(*) FROM s, sp, p WHERE s.s# = sp.s# AND sp.p# = p.p# GROUP BY s.s#;
现在我们非常了解每家供应商提供的产品数量。我们也知道,productstable中有多少产品:
SELECT count(*) FROM p;
如果您比较这些值,您将得到所需的结果:
SELECT amounts.name FROM
( SELECT s.sname AS name, count(*) AS offers
FROM s, sp, p
WHERE s.s# = sp.s# AND sp.p# = p.p#
GROUP BY s.s# ) amounts, -- this is a temp. tablename
( SELECT count(*) AS avaiable FROM p ) countTbl
WHERE amounts.offers = countTbl.avaiable;
注意,我没有测试查询。但是你应该知道如何解决这个问题。
也可以更有效地编写此查询,但这一点很容易理解。
答案 1 :(得分:1)
有两种方法可以做到这一点,我想到的第一种方法就是颠倒逻辑。
不是试图找到P的每个条目,而只是寻找任何不存在的条目,然后从S中排除这些条目:
SELECT *
FROM S
WHERE
NOT EXISTS (
SELECT *
FROM P
LEFT JOIN SP
ON P.P# = SP.P#
AND SP.S# = S.S#
WHERE
SP.P# IS NULL
)