2011-05-18 24 views
3

我有以下表供應商的供應商編號:查找那些誰提供每一個部分

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

,我想找到誰提供每個部分供應商的斯諾。

到目前爲止,我已經寫了這一點:

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

現在我該怎樣寫部分「供應商是提供每一個部分」?

我在考慮從每個供應商Sno的parts = count(pno)開始計數(*)。有人能給我一個提示/寫出平等的第一部分嗎?

謝謝!

+1

我很想相信這不是功課。 [供應商和零件數據庫](http://en.wikipedia.org/wiki/Suppliers_and_Parts_database)是教科書(特別是Chris Date's)和[供應所有零件的供應商](http://www.dbdebunk。 com/page/page/772076.htm)是*經典的關係分割示例。 – onedaywhen 2011-05-19 09:36:18

+0

如果這是真的,請問您的業務分析師他們是否想要有或沒有剩餘物的分工,以及當零件集合是空的時候會發生什麼(例如,所有供應商是否都不提供零件?)如果這是作業,告訴您老師想出更原始的作業:) – onedaywhen 2011-05-19 09:43:26

+0

只要示例教授某些東西,我對使用過去示例的老師沒有任何問題。初學者課程可能最真實。 – Marichyasana 2013-05-22 08:23:45

回答

2

你很近。您需要通過添加組/具有與子查詢子句:

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

關閉我的頭頂,你可以寫在那裏不存在我們不

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

即供應商(部分供應),爲避免計數的解決方案。不知道這是否會比計數效率更高或更低。

+0

可能值得一提的是,這種技術被稱爲「關係鴻溝」,我相信,更多信息可以在這裏找到:https://www.simple-talk.com/sql/t-sql-programming/divided-we-stand -sql-of-relational-division/ – Kdawgwilk 2017-04-01 06:34:06

2
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) 
0
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) 
0

試試這個:

alter proc clr 
@c char(10), 
@pno int output 
as 
    begin 
     declare @f int 
     if exists(select p# from p where [email protected]) 
      begin 
       select @pno=p# from p where [email protected] 
       --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#[email protected] 
       --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#[email protected] 
     end 
     else 
      print'this record is not found' 
    end 
+2

歡迎使用Stack Overflow。儘管這可能(或不可能)回答這個問題,但最好還是增加一個解釋,除了提供代碼之外,你還在做什麼。 – davidism 2014-08-16 03:45:37