如何在sql中选择一种特殊关系的成员

时间:2014-06-20 07:38:56

标签: sql select relationship

我有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”表中的所有产品...

2 个答案:

答案 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
)