Dubletten eines Teilstrings finden

Fragen und Probleme rund um die Abfragespache SQL.
Antworten
matsahm
Neuer Benutzer
Beiträge: 3
Registriert: Di 1. Okt 2019, 13:22

Dubletten eines Teilstrings finden

Beitrag von matsahm » Di 1. Okt 2019, 13:42

Hallo,

Ich komme nicht weiter. Ich möchte Dubletten eines Teilstrings finden.

Tabellenstruktur:
articles_pk bigint (Primärer Schlüssel)
article_number character varying(128)

Die Spalte article_numer ist immer einzigartig und besteht aus dem Lieferanten (7 Ziffern) und der Lieferanten-Artikelnummer (6 Zifern). Um ein Fehler in einer Software zu analysieren, brauche ich eine Liste mit doppelten Lieferanten-Artikelnummern. Unabhängig vom Lieferanten. Das darstellen der Liste mit den Lieferanten-Artikelnummern selber ist kein Problem.

Code: Alles auswählen

SELECT "article_number",SUBSTRING("article_number",8) AS lartnr,"description" FROM "public"."articles" WHERE "article_number";
Ich habe es schon wie folgt erfolglos versucht:

Code: Alles auswählen

SELECT "article_number",SUBSTRING("article_number",8) AS lartnr FROM "public"."articles" GROUP BY "article_number" HAVING (COUNT(SUBSTRING("article_number",8)) > 1)
Leider ohne Ergebnisse. Was mache ich falsch?

Vielen Dank im Vorraus,

matsahm

castorp
Erfahrener Benutzer
Beiträge: 1150
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Dubletten eines Teilstrings finden

Beitrag von castorp » Di 1. Okt 2019, 14:08

Hilft natürlich jetzt nicht mehr, aber als Tip für die Zukunft:
matsahm hat geschrieben:
Di 1. Okt 2019, 13:42
Die Spalte article_numer ist immer einzigartig und besteht aus dem Lieferanten (7 Ziffern) und der Lieferanten-Artikelnummer (6 Zifern).
Das ist ein sehr schlechtes Datenbankdesign. Unterschiedliche Informationen sollten in unterschiedlichen Spalten stehen.
Zwei verschiedene Sachen in einer Spalte zu kombinieren führt über kurz oder lang immer zu Problemen. Bei zwei Spalten hättest Du einfach einen Unique Index auf die Artikelnummer anlegen können, und das Problem wäre gar nicht erst aufgetreten.
(Und warum dürfen da bis zu 128 Zeichen drin stehen, wenn die Regeln besagen, die Kombination darf nie länger als 13 Zeichen sein?)

Um die doppelten Nummern zu finden könntest Du sowas verwenden:

Code: Alles auswählen

SELECT substring(a1.article_number,8) AS lartnr, 
FROM public.articles a1
GROUP BY substring(a1.article_number,8) 
HAVING count(*) > 1;
Wenn Du die restlichen Informationen auch brauchts, dann vielleicht sowas:

Code: Alles auswählen

SELECT a1.article_number, 
       SUBSTRING(a1.article_number,8) AS lartnr 
       a1.description 
FROM public.articles a1
WHERE exists (select *
              from public.articles a2
              where a2.articles_pk <> a1.articles_pk
                and SUBSTRING(a2.article_number,8) = SUBSTRING(a1.article_number,8));
Zuletzt geändert von castorp am Di 1. Okt 2019, 14:44, insgesamt 1-mal geändert.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

akretschmer
Erfahrener Benutzer
Beiträge: 7645
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Re: Dubletten eines Teilstrings finden

Beitrag von akretschmer » Di 1. Okt 2019, 14:16

Angebommen, Du hast:

Code: Alles auswählen

test=*# select * from matsahm ;
 article_number 
----------------
 1111111123456
 1111111234567
 1111111345678
 2222222123456
(4 rows)
Dopplelt im Sinne gleicher Substring von 8, 6 Zeichen (Lieferanten-Artikelnummer doppelt):

Code: Alles auswählen

test=*# with doppelt as (select substring(article_number,8,6) from matsahm group by substring(article_number,8,6) having count(*) > 1) select * from matsahm, doppelt where substring(article_number,8,6) = doppelt.substring;
 article_number | substring 
----------------+-----------
 1111111123456  | 123456
 2222222123456  | 123456
(2 rows)
paßt das soweit?
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

matsahm
Neuer Benutzer
Beiträge: 3
Registriert: Di 1. Okt 2019, 13:22

Re: Dubletten eines Teilstrings finden

Beitrag von matsahm » Di 1. Okt 2019, 14:31

VIELEN DANK!

Das hat geklappt:

Code: Alles auswählen

SELECT substring(a1.article_number,8) AS lartnr 
FROM public.articles a1
GROUP BY substring(a1.article_number,8) 
HAVING count(*) > 1;
Nach lartnr musste ich nur das Komma entfernen.

Gruß
matsahm

castorp
Erfahrener Benutzer
Beiträge: 1150
Registriert: Sa 27. Jun 2009, 22:24
Wohnort: Bayern

Re: Dubletten eines Teilstrings finden

Beitrag von castorp » Di 1. Okt 2019, 14:45

matsahm hat geschrieben:
Di 1. Okt 2019, 14:31
Nach lartnr musste ich nur das Komma entfernen.
Copy & Paste Fehler - sorry.

Aber denke mal darüber nach, Dein Datenbankdesign zu korrigieren.
A SQL query walks into a bar and sees two tables. He walks up to them and says 'Can I join you?'

matsahm
Neuer Benutzer
Beiträge: 3
Registriert: Di 1. Okt 2019, 13:22

Re: Dubletten eines Teilstrings finden

Beitrag von matsahm » Di 1. Okt 2019, 15:14

Da brauche ich nicht drüber nachdenken ;-)
Ist die Datenbank einer Software. Und ich habe offiziell kein Zugang bekommen. Aber die Passwörter langen in Klartext auf dem Server in den Configs. Somit habe ich den Zugang irgendwie schon bekommen. Aber ich kann da nicht mal eben das Datenbankkonzept (welches Konzept?) umstellen... So gerne ich es auch wollte. ;-)

Antworten