![]() |
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:
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?
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
Code:
Ergebnis:
ID DATA X102030 Opel X213142 Y608035 Z403067 Toyota |
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. |
AW: SQL-Abfrage; JOIN mit Bedingung?
Zitat:
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. |
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) |
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 |
AW: SQL-Abfrage; JOIN mit Bedingung?
Diese "sprechenden" Schlüssel sind einfach nur Schrott!
Oh Uwe war schneller. Gruß K-H |
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. |
AW: SQL-Abfrage; JOIN mit Bedingung?
Zitat:
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 02:57 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz