【问题标题】:Find the Supplier number for those suppliers who supply every part查找供应每个零件的供应商的供应商编号
【发布时间】:2011-05-18 16:36:20
【问题描述】:

我有以下表格:

Suppliers(Sno, Sname, Address)
Parts(Pno, Pname, Colour)
Catalogue(Sno, Pno, Price)

我想找到供应每个零件的供应商的 Sno。

到目前为止,我已经写了这个:

SELECT s.sname
FROM suppliers s JOIN catalogue c
USING s.sno

现在我该如何写“供应所有零件的供应商”部分?

我正在考虑让每个供应商 Sno 的 count(*) from parts = count(pno)。有人可以给我一个提示/写下平等的第一部分吗?

谢谢!

【问题讨论】:

  • 我愿意相信这不是家庭作业。 supplier and parts database 是教科书中的经典(尤其是 Chris Date 的),the supplier who supplies all parts 经典的关系除法示例。
  • 如果这是真的,请询问您的业务分析师他们是否想要有余数的除法,以及当零件集为空时会发生什么(例如,所有供应商都可以不提供零件吗?)如果这是作业,告诉你老师想出一个更原创的作业:)
  • 我对老师使用过去的例子没有问题,只要例子能教一些东西。可能最适合初学者课程。

标签: mysql sql postgresql


【解决方案1】:
SELECT s.sname
    FROM suppliers s 
        INNER JOIN catalogue c
            ON s.Sno = c.Sno
    GROUP BY s.sname
    HAVING COUNT(c.Pno) = (SELECT COUNT(Pno) FROM Parts)

【讨论】:

    【解决方案2】:

    你已经接近了。您需要使用子查询添加 group by/having 子句:

     group by s.sname having count(*) = (select count(*) from catalogue)
    

    【讨论】:

      【解决方案3】:

      在我的脑海中,你可以写

      SELECT  s.Sno
        FROM  suppliers s
        WHERE NOT EXISTS (
           SELECT  p.Pno
             FROM  parts p
             WHERE NOT EXISTS (
               SELECT  c.*
                 FROM  catalogue c
                 WHERE c.Pno = P.Pno
                   AND c.Sno = S.Sno
               )
           )
      

      即不存在的供应商(我们不提供的部分),用于避免计数的解决方案。不知道这是否比计数更有效。

      【讨论】:

      【解决方案4】:
      SELECT s.Sno, s.Sname
      FROM Suppliers s
        CROSS JOIN Parts p
        LEFT JOIN Catalogue c ON s.Sno = c.Sno AND p.Pno = c.Pno
      GROUP BY s.Sno, s.Sname
      HAVING COUNT(*) = COUNT(c.Pno)
      

      【讨论】:

        【解决方案5】:

        试试这个:

        alter proc clr
        @c char(10),
        @pno int output
        as
            begin
                declare @f int
                if exists(select p# from p where colour=@c)
                    begin
                        select @pno=p# from p where colour=@c
                        --set @f=1
                    end
            --  else
            --      set @f=0
              --    return @f
        end
        
        
        --clr 'red',2
        
        select p# from p where colour='red'
        
        
        
        alter proc prcs
        @c char(20)
        as
            begin
                declare @pno numeric(2)
                declare @f int
                exec @f=clr @c,@pno output
                --if @f=1
                --  begin
                        select @pno
                        select s# from sp where p#=@pno
                        --set @i=1
                --  end
        
                    --set @i=0
            --return @i
        end
        
        prcs 'red'
        
        select * from sp
        
        select * from p,sp where p.p#=sp.p# and colour='red'
        
        
        alter proc prcj  
        @c char(10)
        as
            begin
                declare @i int
                exec @i=prcs @c
                if @i=1
                    begin
                        print'list of supplier'
                        select sname from s
                        where s#=@c
                end
                else
                    print'this record is not found'
            end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-10-23
          • 2016-04-12
          • 1970-01-01
          • 1970-01-01
          • 2011-01-10
          相关资源
          最近更新 更多