2017-02-25 2 views
0

Platz hatten ein kleines Problem mit einer Frage aus meinem Lehrbuch Ich habeFinden Sie die Nummer und den Namen des jeweiligen Kunden, die eine Bestellung nicht auf 2010.10.23

die Frage „8e A Guide to SQL“ ist auf „Nummer und den Namen jedes einzelnen Kunden zu finden, die nicht den Auftrag am 23. Oktober 2010 Ort hat“

die Abfrage schrieb ich wie folgt aussieht:

SELECT CustomerNum, CustomerName 
FROM tblCustomer 
WHERE EXISTS 
(SELECT Orderdate 
FROM tblOrders 
Where NOT OrderDate = '10/23/2010'); 

die Ausgabe entsprechend unserer Antwortschlüssel ist falsch.

kann mir jemand sagen, was ich falsch mache?

+0

Ohne die Tabellenstrukturen der Tabellen, die Sie verwendet haben, ist es uns nicht möglich, Ihre Frage zu beantworten! –

+2

Sie sollten uns zumindest sagen, wie die beiden Tabellen verwandt sind. Die meisten Antworten gehen davon aus, dass die "CustomerNum" der Link ist, aber das ist nicht sicher. –

Antwort

2

Verschieben NOT nach rechts Ort:

SELECT CustomerNum, CustomerName 
FROM tblCustomer as c 
WHERE NOT EXISTS 
(SELECT TOP 1 1 
FROM tblOrders as o 
Where c.CustomerNum = o.CustomerNum AND OrderDate = '10/23/2010'); 
+0

Sie verknüpfen tblOrders nicht mit tblCustomers, daher wird die gesamte tblCustomer-Tabelle zurückgegeben, wenn es auch nur einen tblOrders mit einem Bestelldatum vom 10/23/2010 –

+0

@AzizJaved yes gibt! Du hast recht! Vielen Dank – Backs

+0

die "Top 1" ist redundant, aber 'nicht existiert' ist, wie ich es auch tun würde. –

0

Wir konnten auch Ausdruck dieser Abfrage eine Verwendung kommen:

SELECT t1.CustomerNum, t1.CustomerName 
FROM tblCustomer t1 
LEFT JOIN 
(
    SELECT t1.CustomerNum 
    FROM tblCustomer t1 
    LEFT JOIN tblOrders t2 
     ON t1.CustomerNum = t2.CustomerNum 
    GROUP BY t1.CustomerNum 
    HAVING SUM(CASE WHEN t2.OrderDate = '10/23/2010' THEN 1 ELSE 0 END) > 0 
) t2 
    ON t1.CustomerNum = t2.CustomerNum 
WHERE t2.CustomerNum IS NULL 

Die Unterabfrage alle Zahlen Kunde identifiziert, für die einen oder mehrere Aufträge auf 10/23/2010 stattfand . Die WHERE-Klausel entfernt diese Kunden. Beachten Sie, dass Kunden, die keine Aufträge platziert haben, auch mit dieser Abfrage beibehalten werden.

+0

Vielen Dank für das Feedback und die Hilfe. Es erwies sich als das Problem, die Beziehung nicht zu etablieren und sich nicht zu bewegen. Dies ist meine erste SQL-Klasse und ich lerne immer noch viel, auch hier zum ersten Mal. –

0

Ich hoffe, ich habe Ihre Frage richtig verstanden.

Bitte überprüfen Sie die Abfrage unten.

select CustomerNum, CustomerName from 
(
SELECT CustomerNum, CustomerName , 
sum(case when Orderdate='10/23/2010' then 1 end) ord_on_23 
FROM tblOrders 
group by CustomerNum, CustomerName 
) 
where ord_on_23=0; 
0

Ich würde es auf diese Weise abfragen:

select distinct CustomerNum,CustomerName from tblCustomer 
except 
select o.CustomerNum,c.CustoemrName from tblCustomer c, tblOrders o where c.CustomerNumber=o.CustomerNumber and OrderDate='10/23/2010' 
Verwandte Themen