AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL Abfrage mit Distinct - Unterdrücken doppelter Datensätze
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Abfrage mit Distinct - Unterdrücken doppelter Datensätze

Ein Thema von needatip · begonnen am 15. Nov 2005 · letzter Beitrag vom 16. Nov 2005
Antwort Antwort
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#1

SQL Abfrage mit Distinct - Unterdrücken doppelter Datensätze

  Alt 15. Nov 2005, 20:52
Datenbank: SQL Sever • Version: 2000 • Zugriff über: ADO
Hallo, ich habe folgendes Problem mit einer SQL Abfrage.
Ich habe 2 Tabellen mit folgendem Aufbau

1. Tabelle Lager
I_Nummer (Primärschlüssel)
Warengruppe
Bezeichnung

2. Tabelle Bilder
NR (Primärschlüssel)
LagerNr
Name

Nun erstelle ich eine Abfrage wie folgt.

SQL-Code:
SELECT DISTINCT LAGER.I_Nummer, LAGER.Warengruppe
FROM LAGER INNER JOIN
     Bilder ON LAGER.I_Nummer = Bilder.LagerNr
ORDER BY LAGER.Warengruppe
Es werden von der Lager-Tabelle nur jeweils ein Datensatz ausgegeben, was ich auch möchte.

Sobald ich aber auch das Feld 'NR' der Bilder-Tabelle mit angebe bekomme ich auch immer die doppelten Datensätze angezeigt.

SQL-Code:
SELECT DISTINCT LAGER.I_Nummer, LAGER.Warengruppe, Bilder.LagerNr, Bilder.NR
FROM LAGER INNER JOIN
     Bilder ON LAGER.I_Nummer = Bilder.LagerNr
ORDER BY LAGER.Warengruppe
Wie kann ich das verhindern, so dass nur ein Datensatz von der Lagertabelle ausgegeben wird?
  Mit Zitat antworten Zitat
Nightshade

Registriert seit: 7. Jan 2003
Ort: Menden
192 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: SQL Abfrage mit Distinct - Unterdrücken doppelter Datens

  Alt 15. Nov 2005, 21:08
Versuch mal ein :

SQL-Code:
SELECT DISTINCT LAGER.I_Nummer, LAGER.Warengruppe, Bilder.LagerNr, Bilder.NR
FROM LAGER INNER JOIN
     Bilder ON LAGER.I_Nummer = Bilder.LagerNr
ORDER BY LAGER.Warengruppe
GROUP my Lager.I_Nummer
Christian
Killing for peace is like fucking for virginity

Nightshade
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: SQL Abfrage mit Distinct - Unterdrücken doppelter Datens

  Alt 15. Nov 2005, 21:20
Das funktioniert aber nicht.
Da bekomme ich folgenden Fehler vom SQL Server zurück.

Zitat:
Falsche Syntax in der Nähe des Group-Schlüsselwortes.
Das "my" hab ich natürlich durch "BY" ersetzt.
  Mit Zitat antworten Zitat
Benutzerbild von mikhal
mikhal

Registriert seit: 11. Sep 2003
Ort: Linz am Rhein
796 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: SQL Abfrage mit Distinct - Unterdrücken doppelter Datens

  Alt 16. Nov 2005, 06:11
Die Reihenfolge von Group By und Order By ist vertauscht.

Grüße
Mikhal

[Edit] Rechtschreibfehler...[/edit]
Michael Kraemer
Computer erleichtern die Arbeit...
...und die Erde ist eine Scheibe!
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#5

Re: SQL Abfrage mit Distinct - Unterdrücken doppelter Datens

  Alt 16. Nov 2005, 07:24
Guten Morgen.

Zitat von needatip:
SQL-Code:
SELECT DISTINCT LAGER.I_Nummer, LAGER.Warengruppe
FROM LAGER INNER JOIN Bilder ON LAGER.I_Nummer = Bilder.LagerNr
ORDER BY LAGER.Warengruppe
Es werden von der Lager-Tabelle nur jeweils ein Datensatz ausgegeben, was ich auch möchte.
Kein Wunder. Diese Abfrage wird vom query optimizer vereinfacht zu:

SQL-Code:
SELECT LAGER.I_Nummer, LAGER.Warengruppe
FROM LAGER
ORDER BY LAGER.Warengruppe
Zitat von needatip:
Sobald ich aber auch das Feld 'NR' der Bilder-Tabelle mit angebe bekomme ich auch immer die doppelten Datensätze angezeigt.

SQL-Code:
SELECT DISTINCT LAGER.I_Nummer, LAGER.Warengruppe, Bilder.LagerNr, Bilder.NR
FROM LAGER INNER JOIN Bilder ON LAGER.I_Nummer = Bilder.LagerNr
ORDER BY LAGER.Warengruppe
Wie kann ich das verhindern, so dass nur ein Datensatz von der Lagertabelle ausgegeben wird?
Auch hier wirft der query optimizer dein DISTINCT raus, weil es keinen Sinn macht. Wenn du den Fremdschlüssel in der abhängigen Tabelle per DRI (declarative referential integrity) so geschützt hast, dass Bilder ohne zugehörigen Eintrag in der Lagertabelle unmöglich sind, dann erhältst du bei deiner Abfrage natürlich genau so viele Tupel im result set, wie Tupel in deiner Bilder-Tabelle sind.

Was hast du vor? Offensichtlich hast du kein, ein oder mehrere Bilder zu jeder LagerNr. Wenn du nur ein Bild von vielen möglichen auswählen willst, dann musst du vor dem Join die Bilder-Tabelle filtern.

Grüße vom marabu
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#6

Re: SQL Abfrage mit Distinct - Unterdrücken doppelter Datens

  Alt 16. Nov 2005, 08:10
Sehr gut erklärt.
Ich möchte jedem Eintrag in der Lagertabelle den ersten Eintrag in der Bildtabelle zuordnen.
Es gibt in der Bildtabelle entweder keines,eines oder viele Bilder, die zu einem Eintrag in der Lagertabelle gehören.
Kannst Du mir bitte helfen den SQL Befehl zusammenzubauen und das mit dem Filter erklären?
Danke.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#7

Re: SQL Abfrage mit Distinct - Unterdrücken doppelter Datens

  Alt 16. Nov 2005, 08:37
Gerne. Du hast eine master-detail relationship zwischen Lager M und Bilder D. Da wir keine mächtigeren Sprachmittel für die Formulierung eines theta joins zur Verfügung haben, arbeiten wir mit einer "view" um die gewünschte (0,1) Komplexität der Beziehung für den folgenden equi join herzustellen:
SQL-Code:
SELECT M.I_Nummer, M.Warengruppe, D.NR
FROM LAGER M
INNER JOIN (
  SELECT LagerNr, MIN(NR) AS NR FROM Bilder GROUP BY LagerNr
) AS D ON M.I_Nummer = D.LagerNr
ORDER BY M.Warengruppe
Alles klar?

Für die Namensgebung in Datenbanken gibt es best practices. Tabellen tragen in der Regel den entity name im Plural. Aber dein Datenbank-Design ist bestimmt noch nicht fertig - oder?

marabu
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: SQL Abfrage mit Distinct - Unterdrücken doppelter Datens

  Alt 16. Nov 2005, 09:11
Hey wahnsinn ! Super !!!!
Hab jetzt noch folgendes Problem.
Ich muss noch ergänzen ob die Lagereinträge bestimmte Werte haben, die ich vorher bestimme.
Also in etwa so:

z.B. WHERE M.Warengruppe IN (10,20,30) Wo und wie baue ich das noch mit ein?
(Ich bin noch kein SQL-Weltmeister)

Dann bin ich fertig mit meinem SQL Befehl.
Danke.
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#9

Re: SQL Abfrage mit Distinct - Unterdrücken doppelter Datens

  Alt 16. Nov 2005, 09:15
SQL-Code:
SELECT M.I_Nummer, M.Warengruppe, D.NR
FROM LAGER M
INNER JOIN (
  SELECT LagerNr, MIN(NR) AS NR FROM Bilder GROUP BY LagerNr
) AS D ON M.I_Nummer = D.LagerNr
WHERE M.Warengruppe IN (:wg)
ORDER BY M.Warengruppe
Fertig...
  Mit Zitat antworten Zitat
needatip

Registriert seit: 11. Jan 2004
246 Beiträge
 
Delphi 10.4 Sydney
 
#10

Re: SQL Abfrage mit Distinct - Unterdrücken doppelter Datens

  Alt 16. Nov 2005, 09:49
Das nenn ich schnelle und kompetente Hilfe.
Danke nochmals.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:35 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz