Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   alternative wenn select distinct gleiche record nicht filtert. (https://www.delphipraxis.net/209767-alternative-wenn-select-distinct-gleiche-record-nicht-filtert.html)

Kostas 18. Jan 2022 14:18

Datenbank: Firebird • Version: 3.0 • Zugriff über: FIREDAC

alternative wenn select distinct gleiche record nicht filtert.
 
Hallo Zusammen,

ich habe ein komplexes select mit subselects und verwende auch union. Darüber habe ich ein weiteres select distinct * aufgesetzt und die doppelten Dantesätze zu eliminieren. Doch sie werden nicht eliminiert.
Gibt es eine Alternative zu select distinct welche die doppelten herausfiltern kann?

//Das folgene Select ist nur ein Beispiel. Mein Select ist deutlich komplexer möglicherweise gibt es einen Zustand den FB nicht berücksichtigt.
//Die Frage ist ob es eine alternative zu distinct gibt.

Code:
select distinct *
from (
        select a,b,c
          from tbl
         
        union
 
        select a,b,c
          from tbl2

       union
   
     )

Gruß Kostas

Delphi.Narium 18. Jan 2022 14:27

AW: alternative wenn select distinct gleiche record nicht filtert.
 
Hier gibt es direkt zwei Probleme:

Distinct filtert doppelte.
Union filtert doppelte.

Es können also keine Doppelten übrigbleiben.

Ohne das fehlerverursachende SQL, nur anhand des Beispielfragmentes, kann man keinerlei Aussage zu möglichen Fehlerquellen treffen.

Werden Sätze doppelt angezeigt, so gibt es bestimmt (unsichtbare) Unterschiede, wie z. B. folgende Leerzeichen bei Zeichenfolgen, Abweichungen bei den Nachkommastellen (ausserhalb des dargestellten Bereiches, z. B. ab der dritten von zwei dargestellten Nachkommastellen), ...

DeddyH 18. Jan 2022 14:27

AW: alternative wenn select distinct gleiche record nicht filtert.
 
Wenn es kein Bug in Firebird 3.0 ist, dann sind die Ergebnismengen sehr wahrscheinlich doch nicht gleich. Sind da vielleicht Leerzeichen enthalten oder sonst etwas, was man nicht sieht? Normalerweise benötigt man nämlich kein DISTINCT bei einer UNION, da damit automatisch doppelte Datensätze eliminiert werden, im Gegensatz zu UNION ALL.

jobo 18. Jan 2022 15:59

AW: alternative wenn select distinct gleiche record nicht filtert.
 
Du könntest statt des finalen
"Select distinct * from (.."
ein
Code:
Select <meine eindeutigen Felder> from (
<Mein kompliziertes Select mit Union>
) x
group by <meine eindeutigen Felder>
having count(*)>1
probieren.

<meine eindeutigen Felder>
sollte dabei eine Liste von Spalten sein, anhand derer Du halbwegs sicher sein kannst (oder bist), dass die eindeutig sind. Wenn das Ergebnis leer ist, lass dort Felder weg. Wenn das Ergebnis zu lang ist, unübersichtlich, nimm Felder hinzu. Felder mit der Eigenschaft unscharf sein zu können, am besten nicht aufnehmen (Float, ..)

Kostas 18. Jan 2022 16:04

AW: alternative wenn select distinct gleiche record nicht filtert.
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich konnte die Ursache für das Fehlverhalten schon lokalisieren können. Es liegt daran dass ich "list" verwende.
Warum die Datensätze mehrfach ausgegeben werden, liegt daran dass die Person mehrere Funktionärsämter hat und in allen Ämtern die gleiche Mailadresse angegeben hat.

Das SQL habe ich runterbrechen können auf das hier:

Code:
select distinct *
from(
    select distinct p.personid, p.namen, p.vorname, f.email as Email,
           (select distinct list(k.kontakt)
              from kontakte k
             where (k.personid = p.personid)
               and (k.kontakttyp in (4,8))
               and (k.geloescht = 0)
               ) as KontakteEmail
    from personen p

    join funktionaere f on (f.personid = p.personid) and (f.funktionaerid > 10000)
   
    where p.personid = 386198
)
Ohne dem Subselect mit List funktioniert es schon. Damit mache ich folgendes: Eine Person kann unter Kontakte mehrere Emailadressen haben. Alle Emailadressen sollen als Kommaseparierte Listen ausgegeben werden. Unter diesen Umständen funktioniert distinct nicht.


Noch eine Besonderheit:
Dieses SQL in IBExpert ausgeführt, zeigt die List mit allen Feldern incl. das List Feld "KontakteEmail"
Wenn ich das result in csv exportieren, wird dieses Feld NICHT exportiert. Ist doch auch komisch.

himitsu 18. Jan 2022 16:19

AW: alternative wenn select distinct gleiche record nicht filtert.
 
Ist denn wirklich alles geich?

Im Postgres kann man dem DISTINCT sagen, was er vergleichen soll (standardäßig alle Spalten).
Vielleicht geht sowas auch irgendwie in angeren SQL-Sprachen?

SQL-Code:
SELECT DISTINCT a, b, c, d, e FROM x

SELECT DISTINCT ON (a, b) a, b, c, d, e FROM x -- nur A und B vergleichen
Statt A oder B kann man dem DISTINCT auch Komplexeres geben und dort z.B. Felder runden, um "unsichtbare" Nachkommastellen zu ignorieren, oder auch ein Trim(a).

Kostas 18. Jan 2022 16:33

AW: alternative wenn select distinct gleiche record nicht filtert.
 
In meinem Fall muss ich wirklich alle Felder vergleichen. Es kann 1:n Funktionärsämter mit jeweils einer AmtsMailadresse und 1:n Kontakte mit KontakteMailadressen geben. Ist nicht wirklich schlimm, da ich das im Programm nochmals sequenziell durchgehe und ein Array befülle.

Kostas 18. Jan 2022 16:41

AW: alternative wenn select distinct gleiche record nicht filtert.
 
Vielen Dank Jo,

dein Vorschlag funktioniert.

Code:
Select personid, namen, vorname, AmtsEmail, KontakteEmail
 from (
    select distinct p.personid, p.namen, p.vorname, f.email as AmtsEmail,
           (select distinct list(k.kontakt)
              from kontakte k
             where (k.personid = p.personid)
               and (k.kontakttyp in (4,8))
               and (k.geloescht = 0)
               ) as KontakteEmail
    from personen p
    join funktionaere f on ((f.personid = p.personid) and (f.funktionaerid > 10000))


    where p.personid = 386198

)
group by personid, namen, vorname, AmtsEmail, KontakteEmail
having count(*)>1

[Edit] Das List-Feld KontakteEmail wird von IBExpert dennoch nicht exportiert.


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