Ich bin ziemlich neu in SQL und habe das folgende Problem. Betrachten Sie diese Tabellen 'Autos' und 'Farben':

[Cars]
CarID   | Brand | ColorID   | Amount
1       | Ford  | 10        | 23
2       | VW    | 11        | 15
3       | Opel  | 11        | 12
4       | Opel  | NULL      | 21
5       | Ford  | NULL      | 16

[Colors]
ColorID | ColorName 
10      | Blue
11      | Red
12      | White
13      | Green

Ich möchte eine Abfrage haben, die alle Autos mit ihren Farbnamen auflistet, damit ich diese Ausgabe habe:

CarID   | Brand | ColorName | Amount
1       | Ford  | Blue      | 23
2       | VW    | Red       | 15
3       | Opel  | Red       | 12
4       | Opel  | NULL      | 21
5       | Ford  | NULL      | 16

SELECT CarID, Brand, ColorName, Amount 
FROM Cars, Colors 
WHERE Cars.ColorID = Colors.ColorID

Lässt die Datensätze weg, bei denen ColorName = NULL ist.

SELECT CarID, Brand, ColorName, Amount 
FROM Cars, Colors 
WHERE Cars.ColorID = Colors.ColorID OR 
      Cars.ColorId IS NULL 

Liefert zu viele Datensätze.

Welche SQL-Anweisung brauche ich hier? Ich verwende Microsoft SQL Server 2012.

Danke, Cooz

1
Cooz 17 Apr. 2018 im 13:26

4 Antworten

Beste Antwort

USE LEFT JOIN

So was:

SELECT ca.CarID, ca.Brand, cl.ColorName, ca.Amount 
FROM Cars AS ca
LEFT JOIN Colors AS cl
ON ca.ColorId = cl.ColorId

AUSGABE:

CarID   Brand   ColorName   Amount
1       Ford    Blue        23
2       VW      Red         15
3       Opel    Red         12
4       Opel    (null)      21
5       Ford    (null)      16

Link zur Demo:

http://sqlfiddle.com/#!18/28f27/1

ERLÄUTERUNG:

LEFT JOIN Funktioniert so

enter image description here

Allgemeine Syntax:

SELECT column-names
  FROM table-name1 LEFT JOIN table-name2 
    ON column-name1 = column-name2
 WHERE condition

Für weitere Informationen folgen Sie den folgenden Links:

https://www.w3schools.com/sql/sql_join_left.asp

http://www.dofactory.com/sql/left-outer-join

2
Nishant Gupta 17 Apr. 2018 im 10:34

Verwenden Sie in der Klausel FROM niemals Kommas. Verwenden Sie immer die richtige, explizite JOIN -Syntax.

Sie suchen nach einem LEFT JOIN, daher lautet die richtige Syntax:

SELECT ca.CarID, ca.Brand, co.ColorName, ca.Amount
FROM Cars ca LEFT JOIN
     Colors co
     ON ca.ColorID = co.ColorID;

Hinweis: Sie sollten auch lernen, Tabellenaliasnamen und qualifizierte Spaltennamen zu verwenden. Wenn sich Ihre Abfrage auf mehr als eine Tabelle bezieht, sollten Sie alle Spaltennamen qualifizieren.

0
Gordon Linoff 17 Apr. 2018 im 10:30

Verwenden Sie die linke Verknüpfung. Dadurch werden alle colorid's aus der zweiten Tabelle ausgewählt und Nullwerte für die Fahrzeuge zurückgegeben, die keine Daten in der Tabelle colours haben

Select  CarID   , Brand , ColorName,   Amount
from cars 
Left join colors 
on cars.colorid = colors.colorid
0
Ven 17 Apr. 2018 im 10:30
SELECT cr.CarID, cr.Brand, cl.ColorName, cr.Amount FROM Cars AS cr
LEFT JOIN colors AS cl ON cr.ColorId = cl.ColorId and 
cl.colorId is not null

Versuchen Sie diesen Kumpel

0
Pugal 17 Apr. 2018 im 12:20