2016-09-28 4 views
0

ich drei Beziehungen haben zu schreiben (für das Problem vereinfacht)Effizientere Möglichkeit, diese SQL-Abfrage

SUPPLIER(SNO) 
PART(PNO, PNAME) 
SHIPMENT(SNO, PNO) 

wo SNO und PNO Fremdschlüssel sind die Primärschlüssel von SUPPLIER und PART

passend ich schrieb Abfrage, um SNO aller Lieferanten zu finden, die zu P2 und P4 versenden. Die Abfrage funktioniert, scheint aber ineffizient zu sein. Ich ausgeschlossen all PNO, die nicht P2 oder P4

waren
SELECT SUPPLIER.SNO, PNO 
FROM SUPPLIER 
JOIN SHIPMENT ON SUPPLIER.SNO = SHIPMENT.SNO 
WHERE PNO <> 'P1' AND PNO <> 'P3' AND PNO <> 'P5' AND PNO <> 'P6' 

Es hat eine bessere Art und Weise, um diese Abfrage zu schreiben. Ich benutze mssql-server

EDIT: Ich lerne gerade SQL und war nicht bewusst, der IN-Operator. Danke für die Hilfe

+1

Warum die anderen 'pno's ausschließen und nicht nur' p2' und 'p4' einschließen? – Mureinik

+0

Bearbeiten Sie Ihre Frage und geben Sie Beispieldaten an. Erklären Sie auch, warum Sie nicht nur PN0 IN ('P2', 'P4') 'verwenden. –

+0

@Mureinik Ich lerne gerade SQL und war nicht bewusst, die IN-Operator – kemotoe

Antwort

2

Wenn die Aufgabe Datensätze mit PNO zu finden, ist entweder 'P2' oder 'P4', Sie sollten diese auswählen und nicht in die Tabelle schauen, sehen, dass es nur Werte von "P1" bis "P6" gibt, und diese ausschließen. Sobald jemand einen 'P7' Datensatz hinzufügt, wird Ihre Abfrage fehlschlagen, weil es nicht nur Datensätze für 'P2' und 'P4', sondern auch für 'P7' erhält.

Eine entsprechende WHERE-Klausel

WHERE PNO = 'P2' OR PNO = 'P4' 

oder wie wurde

WHERE PNO IN ('P2','P4') 

Wenn mit Daten aus mehr als einer Tabelle zu tun, sollten Sie immer die Spalten qualifizieren, dh verwenden SHIPMENT.PNO stattdessen würde gezeigt von nur PNO.

Es ist eine gute Idee, Tabellenaliasnamen zu verwenden, um die Abfrage zu verkürzen. Und aus Gründen der Lesbarkeit sollten Sie nicht in Großbuchstaben schreiben.

SELECT supp.sno, ship.pno 
FROM supplier supp 
JOIN shipment ship ON supp.sno = ship.sno 
WHERE ship.pno IN ('P1','P4'); 

Und noch etwas: Wie der Versand Tabelle soll zeigen alle Werte Ihre Ergebnisse hält, müssen Sie in Ihrer Anfrage natürlich den Lieferanten Tabelle nicht benötigen.

SELECT sno, pno 
FROM shipment 
WHERE pno IN ('P1','P4'); 

Wenn Ihre Tabelle Duplikate enthält, können Sie verschiedene Zeilen mit SELECT DISTINCT sno, pno statt wählen.

1

Sie könnten ein in

SELECT SUPPLIER.SNO, PNO 
FROM SUPPLIER 
JOIN SHIPMENT ON SUPPLIER.SNO = SHIPMENT.SNO 
WHERE PNO not in ('P1' , 'P3' ,'P5' , 'P6') 
1


Hallo,
Sie können unter Abfrage verwenden, um sie effizienter zu machen,

SELECT SUPPLIER.SNO, PNO 
FROM SUPPLIER 
JOIN SHIPMENT ON SUPPLIER.SNO = SHIPMENT.SNO 
WHERE PNO not in ('P1', 'P3', 'P5', 'P6'); 
1

Sie konnten verwenden nicht verwenden nicht.

Where PNO not in ('P1', 'P3', 'P5', 'P6') 

Oder vielleicht sogar einfach wäre

where PNO in ('P2', 'P4') 
1

können Sie die Klausel IN versuchen

SELECT SUPPLIER.SNO, PNO 
FROM SUPPLIER 
JOIN SHIPMENT ON SUPPLIER.SNO = SHIPMENT.SNO 
WHERE PNO IN ('P2','P4') 
1
SELECT SUPPLIER.SNO, PNO 
FROM SUPPLIER 
JOIN SHIPMENT ON SUPPLIER.SNO = SHIPMENT.SNO 
WHERE PNO IN ('P2','P4') 
0

Warum nicht einfach

SELECT SUPPLIER.SNO, PNO 
FROM SUPPLIER 
JOIN SHIPMENT ON SUPPLIER.SNO = SHIPMENT.SNO 
WHERE PNO in 'P2, P4' 
+0

Sie haben die In-Klausel falsch eingegeben. Siehe die anderen Antworten. –

+1

fehlen einige Klammern Polina – scsimon

Verwandte Themen