Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   SQL-Abfrage; JOIN mit Bedingung? (https://www.delphipraxis.net/198836-sql-abfrage%3B-join-mit-bedingung.html)

EmWieMichael 4. Dez 2018 08:46

Datenbank: MSSQL • Version: * • Zugriff über: *

SQL-Abfrage; JOIN mit Bedingung?
 
Hallo SQL-Experten,

ich habe folgendes Problem:
In einer Tabelle (A) befinden sich in Spalte 1 ID-Werte (Strings), deren erstes Zeichen auf eine bestimmte weitere Tabelle hinweist, die ihrerseits einen Datensatz mit der gleichen ID enthalten kann (nicht muss).
Code:
Tabelle A
---------
ID        
X102030
X213142
Y608035
Z403067

Tabelle X
---------
ID         DATA
X102030    Opel

Tabelle Y
--------- 
ID         DATA
Y123456    BMW

Tabelle Z
---------
ID         DATA
Z403067    Toyota
Aufgabe: Ich muss alle Sätze aus Tabelle A, und - falls vorhanden - die zu den ID´s aus A gehörenden Sätze aus den Tabellen X, Y und Z lesen. Ich muss also anhand des ersten Zeichen der ID´s von A entscheiden mit welcher Tabelle ein JOIN gebaut wird. Oder wie auch immer... Hat jemad eine Idee?
Code:
Ergebnis:
ID        DATA  
X102030   Opel
X213142
Y608035
Z403067   Toyota

mkinzler 4. Dez 2018 08:53

AW: SQL-Abfrage; JOIN mit Bedingung?
 
Dämliches Datenbankschema. Durch eine normale Abfrage wird das nicht machbar sein.
Sollte aber über eine SP lösbar sein. Mit MSSQL kenn ich mich aber nicht so aus.

Uwe Raabe 4. Dez 2018 08:53

AW: SQL-Abfrage; JOIN mit Bedingung?
 
Zitat:

Zitat von EmWieMichael (Beitrag 1420043)
Ich muss also anhand des ersten Zeichen der ID´s von A entscheiden mit welcher Tabelle ein JOIN gebaut wird.

Warum? So wie ich das sehe, sind die IDs in Tabelle A eindeutig und die Tabellen X, Y und Z enthalten nur IDs, die auch in A vorkommen. Damit kannst du einen JOIN gleichzeitig über alle drei Tabellen machen.

Edit: Das stimmt offenbar nicht ganz, hat aber auf das Ergebnis keinen Einfluss. Wichtig ist nur, daß in den X, Y und Z Tabellen keine IDs vorkommen, die dort gemäß des ersten Buchstabens nicht rein gehören.

Neutral General 4. Dez 2018 08:54

AW: SQL-Abfrage; JOIN mit Bedingung?
 
Also machen lässt sich dass mit substring(). Und was das joinen selbst angeht bleibt dir denke ich nichts übrig außer beide Tabellen LEFT zu joinen und der Client nimmt sich dann was er braucht.
Wenn dus ganz krass (eklig) machen willst kannst du dir auch das SQL in einer Stored Procedure oder in einem Execute Block zusammenbauen und mit EXECUTE STATEMENT selektieren.

Aber unterm Strich würde ich vorschlagen dass du deine Tabellen anders aufbaust, falls das in deiner Macht steht.
So arbeitet man nicht mit Datenbanken und hat dann eben bei jeder noch so kleinen und einfachen Query einen riesen Salat.

EDIT: Ups.. ich dachte es geht um Firebird. Musst schauen was davon sich auf MSSQL übertragen lässt... (was EXECUTE BLOCK und EXECUTE STATEMENT angeht bin ich mir zumindest unsicher)

Uwe Raabe 4. Dez 2018 09:13

AW: SQL-Abfrage; JOIN mit Bedingung?
 
Ich stelle mir das in etwa so vor:
SQL-Code:
SELECT A.ID, CONCAT(X.DATA, Y.DATA, Z.DATA) AS DATA
FROM TabelleA A
LEFT JOIN TabelleX X ON A.ID = X.ID
LEFT JOIN TabelleY Y ON A.ID = Y.ID
LEFT JOIN TabelleZ Z ON A.ID = Z.ID

p80286 4. Dez 2018 09:17

AW: SQL-Abfrage; JOIN mit Bedingung?
 
Diese "sprechenden" Schlüssel sind einfach nur Schrott!
Oh Uwe war schneller.

Gruß
K-H

jobo 4. Dez 2018 10:54

AW: SQL-Abfrage; JOIN mit Bedingung?
 
Ich denke, Uwe liegt genau richtig mit seinem Vorschlag über die Outer Joins.

Falls die Tabellen sehr breit sind, könnte man alternativ noch ein Union nehmen und sich quälend lange Case Statements (plus den zugehörigen Fehlern) sparen.

P.S.: Ich gehe natürlich davon aus, dass diese Art Datenmodell ein historische "Ursach" hat. Mit anderen Worten, es sollte klar sein, dass es nicht "state of the art" ist. Aber darum geht's hier ja gar nicht.

EmWieMichael 4. Dez 2018 11:31

AW: SQL-Abfrage; JOIN mit Bedingung?
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1420048)
Ich stelle mir das in etwa so vor:
SQL-Code:
SELECT A.ID, CONCAT(X.DATA, Y.DATA, Z.DATA) AS DATA
FROM TabelleA A
LEFT JOIN TabelleX X ON A.ID = X.ID
LEFT JOIN TabelleY Y ON A.ID = Y.ID
LEFT JOIN TabelleZ Z ON A.ID = Z.ID

Wie einfach die Dinge doch sein können, wenn wenn weiß wie´s geht.
Ganz herzlichen Dank!

Zur Tabellenstruktur:
Die Datenbank enthält verschiedene Tabellen verschiedener Struktur. Zum Beispiel Personen, Bäume, Autos. Sämtliche Datensätze besitzen eine eindeutige ID, die mit einem objektabhängigen Buchstaben beginnt: P für Personen, usw. Das Programm erhält über einen WebService Nachrichten, die sich auf jeweils ein Objekt beziehen und dessen ID enthalten. Dieses Objekt kann in der Datenbank hinterlegt sein, muss aber nicht. Die benötigte SQL-Abfrage nutze ich, um dem Anwender in einer Übersicht die Objekte der eingegangenen Nachrichten anzuzeigen - sofern sie lokal gespeichert sind.
Die Nachrichten werden von mehreren Hundert Standorten abgerufen, die teilweise die gleichen Datensätze (mit gleicher ID) lokal speichern. Zugegebn, das klingt etwas schräg. Ist es wohl auch. Kann ich aber nichts dran ändern.

Vielen Dank für Eure Beiträge!


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