2017-09-30 22 views
0

Dies ist eine Hausaufgabe in Bezug auf SQL. Die zwei verwendeten Tabellen sind wie folgt, die darin enthaltenen Daten sind irrelevant.Eine andere SQL-Abfrage

Restaurants 

    RNum | RestaurantName | HQLocation 

und die Auftragstabelle:

Orders 

    CNum | DNum | RNum | Quant | Price 

Das Problem, das ich habe ist, dass ich nicht herausfinden kann, wie Restaurants angeben, die ihre nur Aufträge von Kunden-C200 haben. Die Abfrage ist so formuliert:

"Nennen Sie die Restaurants, deren einzige Bestellung (n) von Kunde C200 kam."

Ich habe versucht, dies eine Reihe von verschiedenen Möglichkeiten zu lösen und werde zwei, die ich dachte, wird funktionieren, obwohl weder getan, da die Antworttabelle sollte nur einen Datensatz enthalten.

Hier ist mein erster Versuch:

SELECT DISTINCT R.RestaurantName 
FROM Orders AS O, Restaurants AS R 
WHERE (O.RNum = R.RNum) 
AND (O.CNum = 'C200') 

und hier ist eine andere:

SELECT DISTINCT R.RestaurantName 
FROM Restaurants AS R 
WHERE EXISTS 
       (SELECT * 
       FROM Orders AS O 
       WHERE (O.RNum = R.RNum) 
       AND (O.Rnum = 'C200')) 

Ich habe viel Mühe, ohne alle anderen Möglichkeiten und alle meine Anfragen immer mehr zurückkehr als ein Datensatz. Gibt es eine Möglichkeit, verschachtelte Abfragen (keine Joins) zu verwenden?

Antwort

1

Geben Sie diesem einen Versuch:

SELECT * FROM Restaurants WHERE RNum IN (SELECT RNum FROM Orders GROUP BY RNum HAVING Sum(IIf([CNum]<>'C200',1,0))=0);

Daten von Ihrem anderen Thread verwenden, 3 Restaurants den Kriterien entsprechen.

+0

dank ich dies ein –

+0

versuchen geben werde, die funktionierten, würde Ich mag wissen, was genau die if-Anweisung obwohl tut, vor allem des“1,0" Teil davon, nochmals vielen Dank @ June7 –

+0

Der Aggregat Summe addiert bedingt 1 für jeden Datensatz, der kein C200 ist, und addiert 0 für jedes C200. Das heißt, wenn das Sum-Ergebnis für ein Restaurant 0 ist, gibt es nur C200 für dieses Restaurant. – June7

0

Mai dieses sql wie weiter unten arbeiten:

SELECT DISTINCT RestaurantName 
FROM Restaurants 
WHERE RNum IN 
(
    SELECT RNum 
    FROM Orders 
    WHERE CNum = "C200" 
) 
+0

Schließt Restaurants, die Bestellungen von C200 sowie andere Kunden hatten, nicht aus. – June7

1

Eine kleine Verbesserung von Antwort des June7:

SELECT RestaurantName FROM Restaurants WHERE RNum IN 
(SELECT RNum FROM Orders GROUP BY RNum HAVING Sum(IIf([CNum]<>'C200',1,0))=0); 
+0

Zustimmen, meine Antwort bearbeitet. – June7

0

Try Code unten.

select distinct r.RestaurantName from Restaurants as r 
inner join Orders as o ON o.RNum = r.RNum 
where o.CNum='c200';