AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken SQL-Abfrage; JOIN mit Bedingung?
Thema durchsuchen
Ansicht
Themen-Optionen

SQL-Abfrage; JOIN mit Bedingung?

Ein Thema von EmWieMichael · begonnen am 4. Dez 2018 · letzter Beitrag vom 4. Dez 2018
Antwort Antwort
EmWieMichael

Registriert seit: 28. Mär 2012
103 Beiträge
 
#1

SQL-Abfrage; JOIN mit Bedingung?

  Alt 4. Dez 2018, 09:46
Datenbank: MSSQL • Version: * • Zugriff über: *
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
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.858 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: SQL-Abfrage; JOIN mit Bedingung?

  Alt 4. Dez 2018, 09:53
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.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#3

AW: SQL-Abfrage; JOIN mit Bedingung?

  Alt 4. Dez 2018, 09:53
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming

Geändert von Uwe Raabe ( 4. Dez 2018 um 09:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: SQL-Abfrage; JOIN mit Bedingung?

  Alt 4. Dez 2018, 09:54
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)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.442 Beiträge
 
Delphi 12 Athens
 
#5

AW: SQL-Abfrage; JOIN mit Bedingung?

  Alt 4. Dez 2018, 10:13
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
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: SQL-Abfrage; JOIN mit Bedingung?

  Alt 4. Dez 2018, 10:17
Diese "sprechenden" Schlüssel sind einfach nur Schrott!
Oh Uwe war schneller.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#7

AW: SQL-Abfrage; JOIN mit Bedingung?

  Alt 4. Dez 2018, 11:54
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.
Gruß, Jo

Geändert von jobo ( 4. Dez 2018 um 11:58 Uhr)
  Mit Zitat antworten Zitat
EmWieMichael

Registriert seit: 28. Mär 2012
103 Beiträge
 
#8

AW: SQL-Abfrage; JOIN mit Bedingung?

  Alt 4. Dez 2018, 12:31
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!
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:58 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