Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi verschachteltes SQL-Statement (https://www.delphipraxis.net/56082-verschachteltes-sql-statement.html)

Hansa 31. Okt 2005 21:10

Datenbank: IB/FB • Zugriff über: egal

verschachteltes SQL-Statement
 
Hi,

vielleicht ist der Titel auch falsch gewählt. :mrgreen: Es geht um folgendes : Ich habe eine Artikel-Table. Zu jedem Artikel gibt es in anderer Tabelle 1-3 Einträge. Pro Zeile will ich nun den Artikel anzeigen und die 1-3 Einträge aus der anderen. Ich denke es müßte so gehen :
SQL-Code:
SELECT Bla1, BLA2 from TABLE1 T1 WHERE (SELECT NR FROM TABLE2 WHERE NR = :NR);
Leider haben Versuche in dieser Richtung nicht genützt. Wie geht das jetzt ?

marabu 31. Okt 2005 21:15

Re: verschachteltes SQL-Statement
 
Hi Hansa,

ich fürchte du musst entweder Abstand von deiner Idee oder deinem RDBMS nehmen - eine entsprechende Aggregat-Funktion zur Denormalisierung kenne ich von MySQL, aber nicht von IB/FB.

Grüße vom marabu

Robert_G 31. Okt 2005 21:17

Re: verschachteltes SQL-Statement
 
@Hansa
Ich hoffe für dich und dein Ego, dass mir hier mein User gelöscht wurde, bevor ich das nächste mal von deiner schier endloses Kompetenz lesen muss... ;)
Das ist doch nun wirklich SQL 1x1 :roll:
SQL-Code:
SELECT Bla1
      ,Bla2 
FROM Table1
WHERE Nr in (SELECT Nr
             FROM Table2)
btw: Weder FB noch IB sind in der Lage solche Statements effizient vorzubereiten. Mit einem inner join kommst du möglicherweise schneller ans Ziel. ;)

edit: Ich als Ora-Hase und die AnsiSQL Join Syntax... :lol:
inner join hätte es heißen sollen

jensw_2000 31. Okt 2005 21:23

Re: verschachteltes SQL-Statement
 
Ich kenne zwar IB nicht, aber teste doch mal folgende Formulierung ...

SQL-Code:
SELECT Bla1, BLA2 from TABLE1 T1 
INNER JOIN
  (SELECT NR FROM TABLE2 WHERE NR = :NR) T2
  ON T2.Nr = T1.N1
Übrigens ...
fehlt da nicht was ?
SQL-Code:
SELECT Bla1, BLA2 from TABLE1 T1 WHERE (SELECT NR FROM TABLE2 WHERE NR = :NR);
SQL-Code:
SELECT Bla1, BLA2 from TABLE1 T1 WHERE T1.Nr IN (SELECT NR FROM TABLE2 WHERE NR = :NR);
SELECT Bla1, BLA2 from TABLE1 T1 WHERE T1.Nr = (SELECT NR FROM TABLE2 WHERE NR = :NR);


Schöne Grüße,
Jens
:hi:

marabu 31. Okt 2005 21:27

Re: verschachteltes SQL-Statement
 
Ich glaube es ist besser ich gehe jetzt in mein Bett. Ich habe doch glatt geglaubt, Hansa sucht eine dem GROUP_CONCAT von MySQL ebenbürtige Lösung.

Gute Nacht vom marabu

mschaefer 1. Nov 2005 10:17

Re: verschachteltes SQL-Statement
 
Moin zusammen,

Der inner Join ist für die ein bis drei Zeilen Lösung geklärt, je nach ein bis drei vorkommenden Einträge. Das Problem ist nur das nun in "eine Zeile" zu bekommen. Also ich kenne da keinen SQL-Befehl von IB/FB, der das bewirkt. Mein Weg wäre eine SP zu schreiben die den Inner-Join anwendet und dann die zusätzlichen Spalten oder Concatspalte (was willst Du Hansa) über Variablen generiert (Aber möglicherweise gibt es da ja inzwischen neue- oder uralt-SQL-Standarts,die nich kenne...) .

Grüße // Martin

Marcel Gascoyne 1. Nov 2005 13:59

Re: verschachteltes SQL-Statement
 
Wie sehen denn Deine beiden Tabellen aus ? Ich denke mal Du meinst folgendes:

SQL-Code:
select t1.nr,t1.bla1,t1.bla2,t2.bla3 from table1 t1,table2 t2 where t2.nr = t1.nr
Gruß,
Marcel

Hansa 1. Nov 2005 14:47

Re: verschachteltes SQL-Statement
 
SQL-Code:
CREATE TABLE TABLE1 (
    ID   INTEGER NOT NULL,
    NAME CHAR(10)
);

CREATE TABLE TABLE2 (
    ID        INTEGER NOT NULL,
    ID_TABLE1  INTEGER,
    TEST      INTEGER
);

INSERT INTO TABLE1 (ID, NAME) VALUES (1, '1         ');

COMMIT WORK;

INSERT INTO TABLE2 (ID, ID_TABLE1, TEST) VALUES (1, 1, 1);
INSERT INTO TABLE2 (ID, ID_TABLE1, TEST) VALUES (2, 1, 2);
INSERT INTO TABLE2 (ID, ID_TABLE1, TEST) VALUES (3, 1, 3);

COMMIT WORK;



/******************************************************************************/
/****                             Primary Keys                            ****/
/******************************************************************************/

ALTER TABLE TABLE1 ADD CONSTRAINT PK_TABLE1 PRIMARY KEY (ID);
ALTER TABLE TABLE2 ADD CONSTRAINT PK_TABLE2 PRIMARY KEY (ID);
In Table 2 habe ich drei Werte. In Table 1 nur einen. Zu diesem einen sollen die drei anderen in einer Zeile angezeigt werden ! In Table 2 gibt es 0-3 verschiedene Werte, die sich auf Table 1 beziehen. Gelänge es diese Daten in einer Zeile, also in einer Datenmenge pro Record aus Table1 unterzubringen, dann würde sich ein Programmteil stark vereinfachen lassen. Mit Next könnte ich im Programm dann leichter durch die Daten wandern, weil eben nicht sicher ist, ob die möglichen Werte bis 3 überhaupt da sind.

marabu 1. Nov 2005 18:41

Re: verschachteltes SQL-Statement
 
Hallo Hansa,

ganz im Ernst, eine Zeilen-Spalten-Transposition mit ANSI SQL lässt sich unter deinen Randbedingungen - minmax Komplexität (0, 3) - wahrscheinlich mit einer Select Procedure über zwei Cursor implementieren, aber wo soll da netto noch eine Vereinfachung raus schauen? Ist ein Left Outer Join wirklich so schlimm? Wenn du dunkle Wege gehen willst, dann kannst du auch gleich den Array Datentyp in Table1 verwenden und auf Table2 ganz verzichten.

Grüße vom marabu


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