SQL - Wert in anderer, ungleicher Zelle finden

Hallo,

ich habe ein Problem und weiß nichtmal so richtig wie ich es formulieren soll.

Ich habe 2 Tabellen.
In der 1. Steht eine ID, Format Number(10,0).
In der 2. steht die ID in einer Spalte, wo auch mehrere IDs (durch : getrennt)stehen können. Format hier = Varchar.
(Fragt nicht warum die Tabellen so komisch angelegt sind - ich muss jetzt nur damit zurecht kommen. Ändern kann ich die Tabellenstruktur nicht)

Das sieht z.B. so aus:
tabelle 1
ID
1
2
3
4

tabelle2
ID
1:3
4
2
2:3:4:5

Meine Abfrage:

select \*
from tabelle1, tabelle2
where tabelle1.id like tabelle1.id

liefert nur die Zeilen, wo die ID einmal, also genauso vorkommt wie in der anderen Tabelle.

select \*
from tabelle1, tabelle2
where tabelle1.id like '%tabelle1.id%'

oder

select \*
from tabelle1, tabelle2
where tabelle1.id like %tabelle1.id%

bringt gar kein Ergebnis mehr.
Wie bekomme ich es hin, dass auch die Datensätze mit mehreren IDs angezeigt werden, wo die ID der entsprechenden Spalte der tabelle1 enthalten ist?

Info am Rande,: Die allein stehenden IDs sind mit weiteren Daten verknüpft, die ich in der anderen Tabelle benötige. deswegen der ganze Aufwand.

Bin am verzweifeln :frowning:

MFG Uschi

Servus Uschi,

ich habe ein Problem und weiß nichtmal so richtig wie ich es
formulieren soll.

Schmeiss mir einfach ein paar Brocken hin. Als alter Ehekrüppel bin ichs gewohnt mir was draus zu basteln.

Ich habe 2 Tabellen.
In der 1. Steht eine ID, Format Number(10,0).
In der 2. steht die ID in einer Spalte, wo auch mehrere IDs
(durch : getrennt)stehen können. Format hier = Varchar.
(Fragt nicht warum die Tabellen so komisch angelegt sind - ich
muss jetzt nur damit zurecht kommen. Ändern kann ich die
Tabellenstruktur nicht)

Ginge schon. Aber lass mal.

Das sieht z.B. so aus:
tabelle 1
ID
1
2
3
4

tabelle2
ID
1:3
4
2
2:3:4:5

Auweia. Da war ein blutiger Anfänger am Werk.

Meine Abfrage:

select *
from tabelle1, tabelle2
where tabelle1.id like tabelle1.id

liefert nur die Zeilen, wo die ID einmal, also genauso
vorkommt wie in der anderen Tabelle.

Logisch. So stehts ja im Statement, dass der Server machen soll.

select *
from tabelle1, tabelle2
where tabelle1.id like ‚%tabelle1.id%‘

oder

select *
from tabelle1, tabelle2
where tabelle1.id like %tabelle1.id%

bringt gar kein Ergebnis mehr.

Auch wieder logisch, denn Dubletten mit Leerzeichen gibts ja nicht.

Wie bekomme ich es hin, dass auch die Datensätze mit mehreren
IDs angezeigt werden, wo die ID der entsprechenden Spalte der
tabelle1 enthalten ist?

Mit einem MySQL Statement: Keine Chance.
Hol die Daten mit z. B. php da raus. Zerlege die Einträge in ein Array (explode()), und dann kannst mit den Inhalten des Arrays die Datenbank weiter abklappern.

Bin am verzweifeln :frowning:

Hoffe habe bissl geholfen.

MFG Uschi

Gruß
widecrypt

Hi uschi,

In der 1. Steht eine ID, Format Number(10,0).
In der 2. steht die ID in einer Spalte, wo auch mehrere IDs
(durch : getrennt)stehen können. Format hier = Varchar.
(Fragt nicht warum die Tabellen so komisch angelegt sind - ich
muss jetzt nur damit zurecht kommen. Ändern kann ich die
Tabellenstruktur nicht)

wie mein Vorredner schon sagte: AU WEIA!

tabelle2
ID
1:3
4
2
2:3:4:5

Meine Abfrage:

select *
from tabelle1, tabelle2
where tabelle1.id like tabelle1.id

Der Ansatz ist gar nicht mal so schlecht (BTW: welches DB-System ist es eigentlich???).

select *
from tabelle1, tabelle2
where tabelle1.id like ‚%tabelle1.id%‘

Vielleicht solltest du der DB mal sagen, dass es tabelle1.id explizit zunächst in einen String umwandekn muss,

in Oracle etwa so:

select 
 \*
from 
 tabelle1 t1, 
 tabelle2 t2
where 
 t2.id like '%' || to\_char(t1.id, 'FM99999') || '%'

Ungetestet, aber in der Art könnte es gehen (besser noch mit REGEXP_LIKE, dann könnte man genauer prüfen, und t1.id = 9 würde nicht auf ‚19:34:29‘ passen…)

HTH
bernhard

Hallo Uschi,

deine DB hat doch sicher eine Funktion LOCATE oder POSITION ??

Stelle damit einfach die Position des Suchstrings im Zielstring fest:

SELECT tabelle1.id, tabelle2.id
FROM tabelle1, tabelle2
WHERE POSITION( char(tabelle1.id) , tabelle2.id ) > 0

Damit holst du die IDs aus beiden Tabellen, bei denen der String-Wert
von tabelle1.id im String tabelle2.id an einer Position > 0 vorkommt.

Hoffe das hilft dir weiter …
Gruss,
SomeOne

Moin moin

Damit holst du die IDs aus beiden Tabellen, bei denen der
String-Wert
von tabelle1.id im String tabelle2.id an einer Position > 0
vorkommt.

Das würd ich nochmal überdenken.

Hoffe das hilft dir weiter …

Wenn die Daten in aufsteigender reihenfolge da sind ja . Ansonsten nein noch nciht ganz.

aufpassen suchen wir in

10: 11: 3: 7: 5: 6: 4: 8: 9: 1: 12: 21: 25:

so haben wir die 1: bei 11: und nicht bei 1: , man müsste also mit leerzeichen suchen
aber das haben wir beim ersten eintrag ja garnicht .

Also diese suche mit position geht nur bei eindeutigkeit , oder wenn garantiert werden kann das die vorgabe aufsteigend ist .

Gruss,
SomeOne

Hallo,

LOCATE und POSITION ging bei mir leider nicht (evtl. weil es eine Oracle-DB ist?). Ich hab es dann mit INSTR versucht. Das hat zwar funktioniert aber nicht mit dem gewünschten Ergebnis. Es werden hier auch nur die Zeilen ausgegeben, wo die ID allein in der Zelle steht.

Trotzdem Danke für die Mühe.

LG Uschi

Hallo widecrypt,

mit dem Vorschlag von Bernhard REGEXP_LIKE zu benutzen klappt es.

Der Weg mit dem Array wäre auch meine Ausweichlösung gewesen. Aber ich finde es schöner (und Codesparsamer) den Weg über die SQL-Abfrage zu nehmen. Aber das ist wahrscheinlich Geschmackssache…

Trotzdem Danke für die Antwort.

MFG Uschi

Hallo Bernhard,

super, das hat geklappt!!!

String umwandeln hat nicht funktioniert (bzw. funktioniert aber nicht das gewünschte Ergebnis gebracht) aber REGEXP_LIKE war der Richtige Hinweis. Hiermit werden alle Zeilen angezeigt, wo die ID vorkommt - egal an welcher Stelle.

Juhu. Danke soweit. :smile:

Wie das halt so ist: auf eine Lösung folgt nicht selten ein neues Problem…

Jetzt wird für jede ID (aus der Tabelle mit den vielen IDs) eine neue Zeile ertsellt:

t1.id | t2.id
1 | 1:2:4
2 | 1:2:4
4 | 1:2:4
3 | 3

distinct bringt mich da auch nicht weiter… ich tüftel mal ein bissel…

MFG Uschi

P.S.: Es ist eine Oracle-DB.

hi, uschi

super, das hat geklappt!!!

freut mich. Nächster Tipp: suche nach match -> regexp_match(), ersetzen dann mit regexp_replace()

gruss
bernhard

Hallo,

danke. Läuft jetzt alles wunderbar

MFG Uschi