AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen
Thema durchsuchen
Ansicht
Themen-Optionen

Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen

Ein Thema von BlueStarHH · begonnen am 27. Mär 2017 · letzter Beitrag vom 27. Mär 2017
Antwort Antwort
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#1

Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen

  Alt 27. Mär 2017, 13:11
Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC
Ich habe 2 Tabellen: Master und Detail, die über ein ID-Feld verknüpft sind. Ich möchte nun alle Master-Datensätze haben, zu denen es mindestens einen Detaildatensatz gibt, der im Feld Text das Wort %Test% enthält.

Ich habe dazu zunächst beide Tabelle mit einem Join über ID verbunden. Das hat dazu geführt, dass der selbe Master-Datensatz öfter im Ergebnis zurückgegeben wird, wenn er mehrere Detaildatensätze hat, die %Test% enthalten. Damit die Master-Datensätze nicht mehrfach im Ergebnis enthalten sind, habe ich das "group by" für alle meine 22! Felder hinzugefügt. Ist das richtig/schön so? Gibt es eine bessere/schnellere Möglichkeit?

Hier der Code in kurzer Form:

Code:
select m.id, m.feld2, m.feld3, m.feld4 from Master m
join Detail d on m.id = d.id
where d.text like '%Test%'
group by 1,2,3,4
  Mit Zitat antworten Zitat
Lemmy

Registriert seit: 8. Jun 2002
Ort: Berglen
2.380 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen

  Alt 27. Mär 2017, 13:13
nur mal aus dem Kopf:

select * from Masterdata where ID in (Select distinct MasterID from Clientdata)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#3

AW: Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen

  Alt 27. Mär 2017, 13:16
Wenn keine Felder vom Detail im SELECT auftauchen oder diese Fedler alle pro Master-ID gleich sind (sollten sie hoffentlich), dann reicht auch ein SELECT DISTINCT am Anfanh, um die Mehrfachen zu eliminieren.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
TBx
(Administrator)

Registriert seit: 13. Jul 2005
Ort: Stadthagen
1.891 Beiträge
 
Delphi 12 Athens
 
#4

AW: Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen

  Alt 27. Mär 2017, 13:22
weitere Möglichkeit:
SQL-Code:
SELECT m.*
  FROM Master m
  WHERE EXISTS (SELECT first 1 d.id FROM Detail d where (d.id = m.id) and (d.text like '%TEST%'))
Thomas Breitkreuz
Gruß Thomas
- Admin DelphiPRAXIS
- Admin Delphi-Treff
- Embarcadero MVP
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen

  Alt 27. Mär 2017, 13:22
SQL-Code:
select distinct m.id, m.feld2, m.feld3, m.feld4 from Master m
join Detail d on m.id = d.id
where d.text like '%Test%'
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen

  Alt 27. Mär 2017, 13:28
Danke an alle, es klappt mit den vorgeschlagenen Lösungen. Jetzt habe ich einges zur Auswahl
  Mit Zitat antworten Zitat
Benutzerbild von Nersgatt
Nersgatt

Registriert seit: 12. Sep 2008
Ort: Emlichheim
693 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7

AW: Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen

  Alt 27. Mär 2017, 15:10
Danke an alle, es klappt mit den vorgeschlagenen Lösungen. Jetzt habe ich einges zur Auswahl
Wobei man bei der Lösung von TBx sagen muss, dass er dabei einen full table scan machen muss, was bei größeren Datenbeständen durchaus lange dauern kann.
Daher ist die Lösung von p80286 meiner Meinung nach deutlich besser, weil hier der Optimierer ordentlich arbeiten kann.
Jens
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.351 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen

  Alt 27. Mär 2017, 17:12
Danke an alle, es klappt mit den vorgeschlagenen Lösungen. Jetzt habe ich einges zur Auswahl
Wobei man bei der Lösung von TBx sagen muss, dass er dabei einen full table scan machen muss, was bei größeren Datenbeständen durchaus lange dauern kann.
Daher ist die Lösung von p80286 meiner Meinung nach deutlich besser, weil hier der Optimierer ordentlich arbeiten kann.
Das ist IMHO nicht richtig.
Durch das "IN" LIKE (also %TEXT%) läuft es immer auf einen Full Scan der Detail - Tabelle hinaus. Ein Index bringt hier nichts.
Im Gegenteil - durch ein exists kann pro master_id das Durchlaufen der Detail - Tabelle beim ersten Treffer abgebrochen werden.
Dadurch kann das exists schneller sein - vor Allem dann, wenn der Text häufig vorkommt. Aber relevante Unterschiede kann man hier nicht erreichen.

Frank
Frank Reim
  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 00:26 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