2016-07-19 7 views
1

einstimmt ich diese SQL-Abfrage Übung bekam (# 71) von SQL-EX.RUSQL alle auswählen, die

Diese Übung beinhaltet zwei Tabelle:

  1. Produkt (Hersteller, Modell, Typ)
  2. PC (Code, Modell, Geschwindigkeit, rAM, hD, cD, Preis)

die Frage ist: finden Sie die alle PC-Hersteller, der alle ihre Modelle von PC-Typ in der PC-Tisch.

Die Version, die ich geschrieben habe, ist:

SELECT maker FROM 
(SELECT maker, sum(cast(model1 as int)) as sum1, sum(cast(model2 as int)) as sum2 FROM 
(SELECT p.maker, p.model as model1, pc.model as model2 FROM product AS p 
FULL JOIN pc ON p.model = pc.model 
WHERE p.type = 'PC') AS a 
GROUP BY maker) b 
WHERE sum1 = sum2 

Aber es funktioniert nicht perfekt klappt, könnte jemand darauf hinweisen, wo ich falsch war oder eine bessere Lösung anbieten? Vielen Dank!

+1

Veränderung Gesamt beitreten innere Verknüpfung – TheGameiswar

+2

Sind Sie mit MySQL oder SQL Server? Sie haben beide markiert. – sstan

+0

Wählen Sie, um so unklar zu schließen, bis Sie herausfinden, mit welcher DB Sie arbeiten. (Ich beschuldige Microsoft dafür, solch einen generischen Namen für ihre relationale DB zu wählen.) – jpmc26

Antwort

0

ich auch die folgenden Werke denken. Es ist leicht zu verstehen, und es kann leicht andere Funktionen modifiziert werden, auszuführen („finden alle, die nur 1 fehlen“ etc)

SELECT maker 
FROM (
    SELECT maker, 
     SUM(CASE WHEN PC.model is null THEN 1 ELSE 0 END) AS missing_count 
    FROM Product 
    LEFT JOIN PC ON Product.model = PC.model 
    GROUP BY maker 
) x 
WHERE missing_count = 0 
+0

Es funktioniert! danke sooo viel =) –

0

sollte diese Arbeit:

Select Maker 
    From Products 
    Where Maker Not In 
     (
     Select P.Maker -- If one product is not in PC table PC.Code will be null 
      From Products P 
      Left Join PC On PC.Model = P.Model 
      Where PC.Code Is Null 
     ) 
+0

danke sooooo viel! Ihre Art zu denken ist richtig (obwohl Sie Typ = 'pc' hinzufügen müssen, um PC-Hersteller zu filtern), aber nachdem Sie das hinzugefügt haben, löst Ihre Antwort mein Problem:) –