Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen (https://www.delphipraxis.net/192186-master-datail-join-soll-jeden-master-datensatz-nur-ein-mal-anzeigen.html)

BlueStarHH 27. Mär 2017 12:11

Datenbank: Firebird • Version: 2.5 • Zugriff über: IBDAC

Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen
 
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

Lemmy 27. Mär 2017 12:13

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

select * from Masterdata where ID in (Select distinct MasterID from Clientdata)

himitsu 27. Mär 2017 12:16

AW: Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen
 
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.

TBx 27. Mär 2017 12:22

AW: Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen
 
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%'))

p80286 27. Mär 2017 12:22

AW: Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen
 
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

BlueStarHH 27. Mär 2017 12:28

AW: Master-Datail-Join soll jeden Master-Datensatz nur ein mal anzeigen
 
Danke an alle, es klappt mit den vorgeschlagenen Lösungen. Jetzt habe ich einges zur Auswahl :-)

Nersgatt 27. Mär 2017 14:10

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

Zitat von BlueStarHH (Beitrag 1365636)
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.

dataspider 27. Mär 2017 16:12

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

Zitat von Nersgatt (Beitrag 1365646)
Zitat:

Zitat von BlueStarHH (Beitrag 1365636)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:27 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