2017-11-30 1 views
0

haben, so habe ich die Aufgabe, die Informationen eines Unternehmens genau dann zurückzugeben, wenn ALLE ihre Produkte eingestellt worden sind.Auswahl nur Zeilen, die übereinstimmende Spaltenwerte

Ich habe eine Suppliers und eine Products Tabelle. Die Suppliers Tabelle hat eine ProductID Spalte und die Products Tabelle hat eine ProductID und eine Discontinued Spalte, die ein Bit speichert (1 ist wahr oder 0 ist falsch).

Wenn jemand eine Lösung dafür hat, wäre das ein Lebensretter.

EDIT: die Abfrage, die ich mit würde

select 
    s.CompanyName, p.ProductName, p.Discontinued 
from 
    Suppliers s 
join 
    Products p on s.SupplierID = p.SupplierID 

wie diese etwas arbeiten bin und die Ausgabe so etwas wie dieses

CompanyName     ProductName Discontinued 
------------------------------------------------------------- 
Exotic Liquids    Chai    0 
Exotic Liquids    Chang    0 
Exotic Liquids    Aniseed Syrup  0 
New Orleans Cajun Delights Chef Anton's Cajun Seasoning 0 
New Orleans Cajun Delights Chef Anton's Gumbo Mix 1 
Grandma Kelly's Homestead  Grandma's Boysenberry Spread 0 
Grandma Kelly's Homestead  Uncle Bob's Organic Dried Pears 0 
Grandma Kelly's Homestead  Northwoods Cranberry Sauce 0 
Tokyo Traders     Mishi Kobe Niku  1 
Tokyo Traders     Ikura    0 

aber ich will nur wäre es, die Lieferanten zurück mit Alle eingestellten Produkte

+0

Und was ist das Schema für Unternehmenstabelle? –

+0

@YogeshSharma Ich habe einige Beispiele hinzugefügt – brendan612

Antwort

0

Ich gehe hier ein bisschen aus, aber ich denke, Sie versuchen, zwei Tabellen auf der ProductID zu verbinden.

Wenn das der Fall ist, dann würden Sie SQL-Abfrage wie folgt aussehen:

SELECT a.ProductID, b.Discontinued FROM Suppliers a 
LEFT JOIN Products b ON (a.productID = b.productID) 
WHERE b.Discontinued = true 
+0

Ich habe einige Beispiele hinzugefügt, um es hoffentlich ein bisschen besser zu erklären. Ich werde versuchen, was Sie vorschlagen, obwohl. – brendan612

+0

Ich editierte einen Tippfehler, der zweite 'b.Konfiguriert' – dockeryZ

0
select Suppliers.SupplierID, CompanyName from Suppliers 
inner join Products on 
Products.SupplierID = Suppliers.SupplierID 
where Discontinued = 1 
and Products.SupplierID not in 
(select SupplierID from Products where Discontinued = 0) 
group by Suppliers.SupplierID, CompanyName 
0

ein besserer Entwickler in jeder Sprache, die Sie verwenden. Hör auf, alles gleichzeitig zu tun. Brechen Sie das Problem in verdauliche Stücke. Und lerne, gute Fragen zu stellen. Sie haben eine Frage zur Frage - wie erwarten Sie, dass andere Ihr Problem verstehen und nützliche Vorschläge machen, ohne Ihr Schema zu kennen und zu verstehen, wie Sie es verwenden? Sicher - in diesem Fall ist es ziemlich einfach, aber ein Skript, das Ihre Tabellen generiert, sie mit Beispieldaten füllt und alles enthält, was Sie versucht haben, andere dazu zu ermutigen, darauf zu reagieren.

Der erste Schritt ist also, die Frage zu beantworten, welche Lieferungen nur abgekündigte Produkte liefern. Anscheinend haben Sie alle Informationen, die Sie in Produkt benötigen. Etwas wie:

select P.SupplierID from dbo.Products as P 
group by P.SupplierID 
having min(cast(P.Discontinued as tinyint)) = 1 
order by P.SupplierID; 

Ich denke, das ist richtig, aber es ist immer noch eine Vermutung. Manchmal wird eine Bitspalte im Gegensatz zum Namen "verwendet". Was macht das? Für jede Gruppe, die durch die Gruppenklausel (Lieferanten-ID) generiert wird, bestimmt sie den Mindestwert von Nicht fortgeführt (Gießen ist notwendig, da Sie Min/Max mit Bit nicht verwenden können). Für einen Lieferanten mit allen nicht fortgeführten Produkten muss diese Spalte für alle zugehörigen Zeilen 1 sein. Seit 1> 0 bedeutet dies, dass alle Produkte eines Lieferanten eingestellt werden. Gruppierung gibt uns auch eine eindeutige Reihe von Zeilen.

Nachdem Sie nun wissen, wie Sie einen eindeutigen Satz von SupplierID-Werten generieren können, sollten Sie in der Lage sein, diesen auf alle anderen Abfragen anzuwenden, um Informationen über diese Lieferanten zu erhalten. Sie können beitreten, verwenden Sie IN, verwenden Sie existiert - versuchen Sie alle drei, wenn Sie wirklich eine Lernerfahrung machen möchten.

Verwandte Themen