AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken alternative wenn select distinct gleiche record nicht filtert.
Thema durchsuchen
Ansicht
Themen-Optionen

alternative wenn select distinct gleiche record nicht filtert.

Ein Thema von Kostas · begonnen am 18. Jan 2022 · letzter Beitrag vom 18. Jan 2022
Antwort Antwort
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

alternative wenn select distinct gleiche record nicht filtert.

  Alt 18. Jan 2022, 15:18
Datenbank: Firebird • Version: 3.0 • Zugriff über: FIREDAC
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
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#2

AW: alternative wenn select distinct gleiche record nicht filtert.

  Alt 18. Jan 2022, 15:27
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), ...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#3

AW: alternative wenn select distinct gleiche record nicht filtert.

  Alt 18. Jan 2022, 15:27
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#4

AW: alternative wenn select distinct gleiche record nicht filtert.

  Alt 18. Jan 2022, 16:59
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, ..)
Gruß, Jo
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: alternative wenn select distinct gleiche record nicht filtert.

  Alt 18. Jan 2022, 17:04
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.
Miniaturansicht angehängter Grafiken
2022-01-18_165923.png  
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: alternative wenn select distinct gleiche record nicht filtert.

  Alt 18. Jan 2022, 17:19
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).
$2B or not $2B

Geändert von himitsu (18. Jan 2022 um 17:25 Uhr)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: alternative wenn select distinct gleiche record nicht filtert.

  Alt 18. Jan 2022, 17:33
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.
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.099 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: alternative wenn select distinct gleiche record nicht filtert.

  Alt 18. Jan 2022, 17:41
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.

Geändert von Kostas (18. Jan 2022 um 17:52 Uhr)
  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:06 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