Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL-Abfrage ueber 2 Tabellen (https://www.delphipraxis.net/40397-sql-abfrage-ueber-2-tabellen.html)

Delphi-Coder 15. Feb 2005 06:54

Datenbank: MS SQL-Server • Version: 2000 • Zugriff über: ADO

SQL-Abfrage ueber 2 Tabellen
 
Guten Morgen,

ich steh gerade ein wenig auf'm Schlauch bezueglich einer SQL-Abfrage. Vielleicht koennt ihr mir ja helfen!
Ich habe eine Tabelle 1 mit einer Spalte "Klasse" und eienr Spalte "Gruppe", diese Spalte enthaelt gewisse Werte. Und dann habe ich eine Tabelle 2, die die Spalten "a", "b", "c", "d" und "klasse" enthaelt. In diesen Spalten werden Preise abgelegt.

Nun zu dem Problem: Ich will, dass per SQL aus der Tabelle 1 die Spalten "Gruppe" und "Klasse" wiedergegeben werden. Und: jenachdem, was in Spalte "Gruppe" der Tabelle 1 steht, soll die entsprechende Spalte in Tabelle 2 angesteuert werden und der Preis dazu ausgelesen werden. (Das Ganze dann natuerlich noch mit Tabelle1.Klasse = Tabelle2.Klasse!).

Die Schwierigkeit liegt u.a. darin, das die Werte in der Spalte "Gruppe" der Tabelle 1 nicht genau so lauten, wie die Spalten (a-d) in Tabelle 2!

Gibt es da irgendwie eine Moeglichkeit, das trotzdem per SQL zu machen?

(Ich hoffe, ich hab mich jetzt verstaendlich ausgedrueckt! Und sorry, wenn der Titel ein wenig nichtssagend ist - wusste nicht, wie ich es kurz beschreiben sollte!)

Vielen Dank schonmal fuer eure Muehe!

Gruss,
Delphi-Coder

alcaeus 15. Feb 2005 06:57

Re: SQL-Abfrage ueber 2 Tabellen
 
Zitat:

Zitat von Delphi-Coder
Die Schwierigkeit liegt u.a. darin, das die Werte in der Spalte "Gruppe" der Tabelle 1 nicht genau so lauten, wie die Spalten (a-d) in Tabelle 2!

Und genau darin liegt das Problem. Außerdem, du willst also wenn in "Gruppe" der Wert "Gemüse" steht, willst du auf Spalte "a", wenn der Wert "Obst" steht, dann auf Spalte "b" usw.? AFAIK ist das mit SQL nicht möglich, das musst du in deinem Programm lösen.

Greetz
alcaeus

Delphi-Coder 15. Feb 2005 07:09

Re: SQL-Abfrage ueber 2 Tabellen
 
Hmm... OK! Habe ich mir schon fast gedacht! Aber trotzdem Danke!

Xabbu 15. Feb 2005 07:15

Re: SQL-Abfrage ueber 2 Tabellen
 
Hmmmm... also mit reinem SQL hast du da in der Tat schlechte Karten. SQL ist ja eine mengenorientierte Sprache und sieht kein Fallunterscheidungen vor. Die von dir gewünschte Logik mußt du also entweder in deinem Programm nachbauen oder über Stored Procedures des MSSQLServer realisieren.

Delphi-Coder 15. Feb 2005 07:18

Re: SQL-Abfrage ueber 2 Tabellen
 
Mit StoredProcedures kenne ich mich uebrhaupt nicht aus! Haettet ihr/du da vielleicht ein kleines Beispiel, an dem ich das nachbauen koennte?

Leuselator 15. Feb 2005 07:40

Re: SQL-Abfrage ueber 2 Tabellen
 
gib mal bitte Beispieldaten - 2 Zeilen aus Tabelle 1, 4 aus Tabelle 2 - dann kann man eher helfen
Gruß

Delphi-Coder 15. Feb 2005 08:04

Re: SQL-Abfrage ueber 2 Tabellen
 
Ok, kein Problem!

Code:
Tabelle 1:

Klasse  Gruppe
============================
   A    normale Fahrstunde
   A    Autobahnfahrt
   B    normale Fahrstunde
   B    Fahrt bei Dunkelheit


Tabelle 2:

Klasse  fahrstunde  autobahn  dunkelheit  landstrasse
=========================================================
   A      11,00       13,00       11,00        13,00
   B      12,00       15,00       12,00        14,00
So! Nun sollte zu jedem Wert der Spalte "Gruppe" aus Tabelle 1 der passende Preis aus Tabelle 2 geholt werden! (die Klassen muessen natuerlich uebereinstimmen!)
Ich hab dieses beispiel gewaehlt, weil es vielleicht etwas anschaulicher ist!

alcaeus 15. Feb 2005 08:21

Re: SQL-Abfrage ueber 2 Tabellen
 
Hallo Delphi-Coder,

so wie du die Tabellen jetzt hast wird das nichts.
Ein Vorschlag: definier dir eine Tabelle mit einer ID und den Bezeichnungen Gruppen:
Code:
ID   Name
1     Fahrstunde
2     ...
Zweite tabelle wird deine jetzige Tabelle 1, allerdings wird statt dem Gruppenname die ID aus der vorherigen Tabelle abgespeichert.

Tabelle 2 beinhaltet 3 Spalten:
Code:
Klasse Gruppe Preis
A      1       11
...
Beim Select musst du dann nur noch sagen
SQL-Code:
SELECT Preis FROM Tabelle2 WHERE Tabelle1.Klasse=Tabelle2.Klasse and Tabelle1.Gruppe=Tabelle2.Gruppe
Und das wars dann auch schon.

Greetz
alcaeus

Delphi-Coder 15. Feb 2005 08:25

Re: SQL-Abfrage ueber 2 Tabellen
 
@alcaeus Vielen Dank fuer den Vorschlag! Leider habe ich die DB so vorgegeben und kann sie erstmal nicht aendern! Ich werde deinen Vorschlag aber im Hinterkopf behalten!

alcaeus 15. Feb 2005 09:59

Re: SQL-Abfrage ueber 2 Tabellen
 
Hallo Delphi-Coder,

ich würde den Vorschlag nicht nur im Hinterkopf behalten, sondern evtl. vorschlagen/erzwingen. Wenn ihr jetzt noch eine Autobahnfahrt bei Dunkelheit braucht, dann müsst ihr wieder das DB-Layout ändern (neue Spalte), und das Programm anpassen. Bei meinem Vorschlag müssen nur noch 2-3 Records eingetragen werden, und das wars auch schon wieder.

Greetz
alcaeus

Delphi-Coder 15. Feb 2005 10:08

Re: SQL-Abfrage ueber 2 Tabellen
 
Eine DB-Aenderung von diesem Ausmass halte ich persoenlich zu diesem Zeitpunkt noch fuer vertretbar. Ich werde mal sehen, was sich da machen laesst!
Allerdings wuerde ich eine reine SQL-Server-Loesung (ohne DB-Aenderung) vorziehen. (z. bsp. ueber eine StoredProcedure)

Gruesse
Delphi-Coder

jensw_2000 15. Feb 2005 10:41

Re: SQL-Abfrage ueber 2 Tabellen
 
Beim MSSQL kannst du das so machen ...

SQL-Code:
  // Leeren String deklarieren
  declare @SQL varchar(1000)
  // Die Variable "@Field" (für gewünschten Feldnamen) deklarieren
  declare @Field varchar(50)

  // Die Variable "@Field" mit Feldnamen füllen
  SELECT @Field='Vorname'


  set @SQL = 'Select '+@Field+' from Adressen'

  Exec(@SQL)

  MSSQL führt dann SELECT Vorname FROM Adressen aus :zwinker:
Damit kannst du dir eine SP basteln.
Eine Alternative zur SP wäre eine Funktion (mit RETURNS TABLE), die du dann via SUB-SELECTS einbindest




Schöne Grüße,
Jens

:hi:

Delphi-Coder 15. Feb 2005 10:51

Re: SQL-Abfrage ueber 2 Tabellen
 
@jensw_2000 Vielen Dank! Ich kann es leider erst heute abend probieren. Aber nur fuer den Fall, dass ich damit ueberhaupt nicht klarkomme: Wie funktioniert denn das mit der Funktion und den Sub-Selects?

Viele Gruesse
Delphi-Coder

jensw_2000 15. Feb 2005 11:06

Re: SQL-Abfrage ueber 2 Tabellen
 
Kann es auch grade nicht testen :mrgreen:
theoretisch aber so ...


SQL-Code:
-- eine Funktion erstellen, die dir eine virtuelle Tabelle zurückliefert

CREATE FUNCTION DynamicSQL (@Fieldname VARCHAR(20),@Tablename VARCHAR(40))
  RETURNS TABLE
AS
  -- SQL STRING
  declare @SQL varchar(1000)

  -- Funktionsparameret "verbauen"
  set @SQL = 'Select '+@Fieldname+' from '+@Tablename

  RETURN Exec(@SQL)

Aufruf ...

SELECT * FROM DynamicSQL(@Fieldname=(Select IrgendwasPlausibles FROM TABELLE A), @Tablename='Adressen')
Schöne Grüße,
Jens

:hi:

Delphi-Coder 15. Feb 2005 11:13

Re: SQL-Abfrage ueber 2 Tabellen
 
Erstmal Danke! So auf die Schnelle steige ich da nicht hinter! Aber ich werde mich heute abend ausgiebig damit beschaetigen!

jensw_2000 15. Feb 2005 11:14

Re: SQL-Abfrage ueber 2 Tabellen
 
Falls das
SQL-Code:
RETURN EXEC(@SQL)
nicht functionieren sollte, must du eine
temporäre Tabelle erstellen, füllen, ausgeben und wieder Droppen ....



SQL-Code:
  EXEC (@SQL)
    INTO #TempTable

  RETURN #TEMpTable

Leuselator 15. Feb 2005 12:47

Re: SQL-Abfrage ueber 2 Tabellen
 
Nun - was von dem DB-Design zu halten ist, weißt Du ja nun - hier eine Lösung ohne Stored Procedure:
SQL-Code:
    SELECT Kat.Klasse
         , Kat.Gruppe
         , CASE Kat.Gruppe
             WHEN 'normale Fahrstunde'  THEN P.fahrstunde
             WHEN 'Autobahnfahrt'       THEN P.autobahn
             WHEN 'Fahrt bei Dunkelheit' THEN P.dunkelheit
             WHEN 'Landstrassenfahrt'   THEN P.landstrasse
           END AS Preis
      FROM Tabelle1 Kat
INNER JOIN Tabelle2 P
        ON P.Klasse = Kat.Klasse
Gruß

jensw_2000 15. Feb 2005 12:58

Re: SQL-Abfrage ueber 2 Tabellen
 
@Leuselator
Wie immmer eine einfache und brilliante Lösung ... :mrgreen:
Warum komme ich nie auf sowas ? :wall:


Schöne Grüße,
Jens

:hi:

Delphi-Coder 15. Feb 2005 14:28

Re: SQL-Abfrage ueber 2 Tabellen
 
Vielen Dank fuer die Loesung! Es funktioniert!

Ich werde aber die DB-Aenderung versuchen durchzusetzen!

Gruss aus Dubai,
Delphi-Coder


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