# MSSql Select mit Left Join ohne Duplikate?



## jimb0p (8. Januar 2014)

Hallo Zusammen,

ich sitze im Moment an einer Java Anwendung wo ich auf eine MSSql Datenbank zugreifen muss. Ich habe eine Tabelle wo Produkte mit Primärschlüssel, Name und Lagerbestand gespeichert sind und eine andere Tabelle wo Attribute hinterlegt sind mit Primärschlüssel von Tabelle 1 für die Zuordnung, cName für den Attributenname und cValue der noch einen Wert enthalten kann. Ich benötige nun alle Produkte die nicht cName "nosearch" haben. Das klappt soweit auch, nur da es insgesamt fünf Attribute gibt, bekomme ich immer vier mal das gleiche Produkt. Ich benötige es aber nur einmal. Wie genau kann ich den Code anpassen damit ich es ohne Duplikate bekomme? 


```
SELECT TOP 10 *
  FROM TabellennameProdukte A
  LEFT JOIN TabellennameAttribute B
  ON A.kArtikel = B.kArtikel
  WHERE (B.cName != 'nosearch') 
  AND A.Lagerbestand = 0
  ORDER BY A.kArtikel DESC;
```

kArtikel ist der Primärschlüssel. Ich möchte im nachhinein dann alle Produkte die nicht "nosearch" haben "nosearch" setzen, nur die dürfen dann nicht erneut auftauchen, da ich ja nach dem Lagerbestand 0 auch überprüfe. Ich hoffe ich konnte es deutlich ausdrücken und freue mich über jede Hilfe.


----------



## Yaslaw (8. Januar 2014)

Ein Stern an dieser Stelle ohne Tabellenangaben ist gefährlich. Er gibt dir alle Details aus A und B aus. Somit wird es schwer, das Produkt zu extrahieren.
Ergo solltest du A.* schreiben

Dann hast du x mal genau die gleichen Zeilen. Das kannst du mittels DISTINCT unterbinden

Ich kenne MSSQL nicht wirklich und weiss darum gerade nicht, ob das DISTINCT vor oder nach TOP 10 kommt. Ich denke mal davor


```
SELECT DISTINCT TOP 10 
    a.* 
FROM 
    tabellennameprodukte a 
    LEFT JOIN tabellennameattribute b ON a.kartikel = b.kartikel 
WHERE 
    b.cname = 'nosearch'
    AND a.lagerbestand = 0 
ORDER BY 
    a.kartikel DESC;
```


----------



## jimb0p (8. Januar 2014)

Hallo Danke für die Antwort. Ich hatte noch einen Tippfehler oben es heißt nicht = 'nosearch' sondern != 'nosearch'. Mit Distinct klappt es leider nicht ich bekomme immer folgende Fehlermeldung:

"Der text-Datentyp kann nicht als DISTINCT ausgewählt werden, weil er nicht vergleichbar ist."


----------



## jimb0p (8. Januar 2014)

Wenn ich mich bei DISTINCT nur auf den Primärschlüssel beschränke klappt zwar die Gruppierung, aber da ich ja noch vier andere Attribute habe die nicht 'nosearch' sind, taucht der Eintrag trotzdem auf. Aber ich will ja nur ein Eintrag wenn 'nosearch' bisher nicht gesetzt ist.


----------



## Yaslaw (8. Januar 2014)

Zeig mal dein SQL


----------



## jimb0p (8. Januar 2014)

Ich habe es jetzt mit NOT EXISTS gelöst. Sieht wie folgt aus:


```
SELECT TOP 500 a.*
  FROM Tabelle1 a
  WHERE NOT EXISTS
  (SELECT b.*
	FROM Tabelle2 b
	WHERE b.kArtikel = a.kArtikel AND b.cName = 'nosearch')
ORDER BY a.kArtikel DESC;
```

Spricht da was gegen? Performance schlecht o.ä.?


----------

