Kreuzabfrage zwischen int und vchar

tobisql

Neuer Benutzer
Beiträge
4
Hallo zusammen

Wie der Titel schon sagt habe ich zwei Tabellen die ich über eine "Kreuzabfrage" verbinden / auswerten möchte. Mein Problem ist nur das bei einer Spalte, über die der Vergleich stattfinden soll, ein Buchstabe vor die Zahl gezaubert worden ist.

Das Ganze sieht zum besseren Verständnis so aus:

Tabelle 1 enthält die Spalte ID den Wert 123 Spalte ist als int formatiert
Tabelle 2 enthält die Spalte A ID den Wert A 123 Spalte ist als vchar formatiert

Desweitern soll aus Tabelle 1 nur das angezeigt werden das nicht in Tabelle 2 steht.

Normalerweise wäre das eine Join LEFT / RIGHT Abfrage und kein großes Thema. Aber der Buchstabe stört hier. Was mir jetzt noch einfällt wäre ein Zeiger / Cursor.

Ich weiß jetzt nur nicht wie ich die beiden Sachen zusammen bekommen ohne eine neue Tabelle zu erstellen.
Gibt es da eine Lösung oder muss ich mir hier ein komplettes Script schreiben ?
Gibt es in SQL sowas wie das Recordset in Access, hab mal was über Arrays gelesen. Könnte das funktionieren?

Danke fürs lesen ich hoffe mir kann jemand sagen wie ich das am besten lösen kann.

Gruß
Tobi
 
Werbung:

Kampfgummibaerlie

Datenbank-Guru
Beiträge
622
Ich würde einfach bei der Spalte, die ohne dem A steht das A vorne "dazuschreiben" ;)

Beispiel (PostgreSQL):
Tabelle 1: ID = 123
Tabelle 2: ID = A_123

Abfrage:
Code:
select * from Tabelle 1, tabelle 2 where tabelle2.ID != 'A_'||(tabelle 1.id)
 

Kampfgummibaerlie

Datenbank-Guru
Beiträge
622
EDIT:
Code:
select * from t1, t2 where t2.id = 'A-'||t1.id

Code am Ende editiert, weil es aus irgendeinem Grund nicht funktioniert hat...

Sry für Doppelpost, die Editierzeit war aber bereits vorbei ^^
 

dabadepdu

Datenbank-Guru
Beiträge
1.179
Ist denn klar, was überhaupt abgefragt werden soll?

Eine Kreuzabfrage ist das nicht. Den Begriff gibt es nicht einmal. Es gibt Kreuztabellen Abfragen oder synonym Crosstable oder Pivot Abfragen.
Das bezeichnet die Transformation von Spalten zu Zeilen. Und es gibt das Gegenteil davon, Unpivot.

Desweitern soll aus Tabelle 1 nur das angezeigt werden das nicht in Tabelle 2 steht.

Ein Join mit allen Tab1 Zeilen, die nicht in Tab2 stehen über Spalte ID:
Code:
Select t1.* from t1 left join t2
on t1.id= t2.id
where t2.id is null
Dieser Vergleich ist kritisch, weil die Typen unterschiedlich sind. Es müsste eine implizite Konvertierung erfolgen, Ausgang Glückssache.

Die Abfrage ergibt nicht viel Sinn, wenn die Änderung in Spalte t2.id durchgängig ist.
Das was nicht passt, fliegt so raus. Es ist mehr oder weniger ziemlich natürlich, das Joins nur zueinander passende Sachen ausgeben.

Die Veränderung von t2.id von @Kampfgummibaerlie braucht man, wenn etwas angezeigt werden soll, dass auf der zauberhaften Veränderung beruht.

Hier sind ein paar Varianten:
Code:
-- Entfernen von A plus Typconvertierung VARCHAR nach INT 
select * from t1 join t2 on t1.id = cast(substring(t2.id,2, 3) as int);
-- Ergänzen von A plus Typconvertierung INT nach VARCHAR
select * from t1 join t2 on 'A'+cast(t1.id as varchar) = t2.id;


-- Entfernen von A plus Typconvertierung VARCHAR nach INT 
-- Alle T1 Datensätze left outer mit passenden von t2
select * from t1 left join t2 on t1.id = cast(substring(t2.id,2, 3) as int);


-- Entfernen von A plus Typconvertierung VARCHAR nach INT 
-- Alle T1 Datensätze LEFT outer mit passenden von t2
-- gefiltert auf unpassende t2
select * from t1 left join t2 on t1.id = cast(substring(t2.id,2, 3) as int)
 where t2.id is null;

-- Entfernen von A plus Typconvertierung VARCHAR nach INT 
-- Alle T2 Datensätze RIGHT outer mit passenden von t1
-- gefiltert auf unpassende t1
select * from t1 right join t2 on t1.id = cast(substring(t2.id,2, 3) as int)
 where t1.id is null;
 

tobisql

Neuer Benutzer
Beiträge
4
Guten Morgen

Danke für die Antworten und Hilfestellungen und sorry für die nicht fachlich korrekte Aussage mit Kreuzabfrage.

Zu der Frage was abgefragt werden soll. Die ID-Werte verknüpfen die beiden Tabellen. Es besteht keine direkte Beziehung. In der Tabelle 1 gibt es eine Spalte "Objekt", der durch die Spalte "ID" in beiden Tabellen erkennbar ist. Und dieses Objekt der ID interessiert mich. Was mit dem Ergebnis der Abfrage zumachen ist, würde den Rahmen dieses Beitrages sprengen und hat auch nichts mit SQL oder Datenbanken zu tun. Darum habe ich mich auch nur auf das eigentliche Problem beschränkt.
Mein Problem an der Sache war der Buchstabe vor der ID in der Tabelle 2. Und da habt ihr mit eueren Beiträgen mir schon eine gute Richtung gewiesen.

Wusste zwar das man in anderen Programmiersprachen Typen wandeln kann aber nicht bei SQL. Ich werde das am Montag ausprobieren.

Melde mich dann nochmal ob ich das so hinbekommen wie ich mir das vorstelle.

Vorerst einmal Danke und ein schönes Wochenende
Tobi
 

dabadepdu

Datenbank-Guru
Beiträge
1.179
die nicht fachlich korrekte Aussage
Kein Grund zur Entschuldigung, deswegen hab ich es erklärt. Richtige Begriffe zu kennen, hilft bei der Suche fertig passender Antworten.

Genaugenommen hast Du weiter keine präzise Frage gestellt.
Aber was ich sagen wollte: Meine Beispiele oben mit cast(substring.. funktionieren nur im Beispiel. Die richtigen (sichere) Parameter musst Du entsprechend Deiner Daten festlegen.
 

ukulele

Datenbank-Guru
Beiträge
4.717
Ist eigentlich ganz simpel.

1) Du musst explizit konvertieren, t1.id= t2.id würde nur gehen wenn die VARCHAR()-Spalte numerisch ist, ist sie ja aber nicht.
2) INT zu VARCHAR() ist leichter und weniger fehleranfällig. In derVARCHAR()-Spalte könnte was unerwartetes auftreten und dann wirft die ganze Abfrage einen Fehler.
3) Bitte auch explizit joinen @Kampfgummibaerlie

Code:
SELECT * FROM t1 LEFT JOIN t2 ON 'A_' + convert(VARCHAR()),t1.ID) = t2.A_ID
 

tobisql

Neuer Benutzer
Beiträge
4
Hallo
Aber was ich sagen wollte: Meine Beispiele oben mit cast(substring.. funktionieren nur im Beispiel. Die richtigen (sichere) Parameter musst Du entsprechend Deiner Daten festlegen.

Das ich nur Beispieltabellen und Spalten angegeben hab war schon so gewollt. Und das ich die meinen Bedürfnisse anpassen muss.
Wollte ja keine fertige Lösung ;-) sondern nur den Wink in die Richtung die ich muss.

Und ich denke mit den Ratschlägen von euch müsste das zu schaffen sein. Werde ich Montags wie geschrieben ausprobieren.

Tobi
 
Werbung:

tobisql

Neuer Benutzer
Beiträge
4
Hallo zusammen wie versprochen die Rückmeldung

Kurz und Gut es hat funktioniert. Euere Ratschläge haben mich auf den richtigen Weg gebracht.

Der nette Entwickler des Programms, der die Datenbank mit Daten füllt hatte mir allerdings noch ein "Ei" mit in Nest gelegt. Das hab ich aber erst bemerkt als ich die Abfrage "zusammengebaut" haben.

Es war nicht nur der Buchstabe, sondern er hat mir auch noch eine bestimmte Anzahl von Leerzeichen mit in die Zelle geschrieben. Die hatte ich ja schon bemerkt. Aber des Guten nicht genug :)) . Es aber drauf an wie groß die Zahl war. Bei 3 stelligen Zahlen (z.B. 123) waren es 7 Leerzeichen und bei 4 stelligen Zahlen (z.B. 1234) waren es 6 Leerzeichen.

Wie gesagt mit eueren Wink konnte ich die Join Abfrage machen. Hier die Lösung meines Problems mit den Beispiel t1 und t2 vielleicht hilft es ja mal jemanden weiter.

SELECT * FROM t1 LEFT JOIN t2 ON t1.ID = COVERT(int,(LTRIM(SUBSTRING(t2.A_ID,2,10) WHERE t2.A_ID IS NULL

Also nochmals Danke für die Hilfe und eine schöne Woche
Tobi
 
Oben