Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Update mit Subselect (https://www.delphipraxis.net/96130-update-mit-subselect.html)

Nico80 19. Jul 2007 08:39

Datenbank: Interbase • Version: 7.1 • Zugriff über: IBExpress

Update mit Subselect
 
Hallo an alle, die sich mit SQL auskennen...

ich habe folgende Datenbankstruktur (1:1 Beziehung)

Tabelle A
----------
id_tabelleA
id_tabelleB

Tabelle B
---------
id_tabelleB

Nun möchte ich gerne die Relation zwischen beiden Tabellen ändern

Tabelle A
----------
id_tabelleA
(id_tabelleB) wird nach der Aktualisierung gelöscht

Tabelle B
---------
id_tabelleB
id_tabelleA

Nun ist meine Datenbank aber schon mit Daten gefüllt.
Mein Problem ist es jetzt, wie ich die Daten von A nach B schaffe (Wert der IDs)

Also in etwa:
SQL-Code:
Update Tabelle B SET B.id_tabelleA = (SELECT A.id_tabelleA FROM Tabelle A where A.id_tabelleB=B.id_tabelleA)
Danke für jeden Tip!!!

mkinzler 19. Jul 2007 08:42

Re: Update mit Subselect
 
Wenn es sich ume eine 1:1-Beziehung handelt würde ich die IDs synchronisieren.

Nico80 19. Jul 2007 08:45

Re: Update mit Subselect
 
Zitat:

Zitat von mkinzler
Wenn es sich ume eine 1:1-Beziehung handelt würde ich die IDs synchronisieren.

Und wie?

mkinzler 19. Jul 2007 08:47

Re: Update mit Subselect
 
Tabelle A
----------
id_tabelle


Tabelle B
---------
id_tabelle

A.id_tabelle = B.id_tabelle

Nico80 19. Jul 2007 08:55

Re: Update mit Subselect
 
Zitat:

Zitat von mkinzler
Tabelle A
----------
id_tabelle


Tabelle B
---------
id_tabelle

A.id_tabelle = B.id_tabelle

So ganz kapiere ich das noch nicht.
Ich tausche ja bei beiden Tabellen die Fremschlüssel aus und brauche nun ein SQL-Statement, das die Beziehung zwischen beiden Tabelle wieder herstellt.

mkinzler 19. Jul 2007 09:06

Re: Update mit Subselect
 
Mein Vorschlag wäre ja, nicht 2 verschiedene IDs sondern die selbe zu nehmen.

SQL-Code:
alter TabelleA add id_tabelle;
update TabelleA set id_tabelle = id_tabelleB;
alter TabelleA drop id_tabelleA;
alter TabelleA drop id_tabelleB;

Nico80 19. Jul 2007 09:25

Re: Update mit Subselect
 
Nee das geht so nicht,..

SQL-Code:
update tabelleB B, tabelleA A set B.id_tabelleA=A.id_tabelleA where A.id_tabelleB = B.id_tabelleB;
So in etwa stelle ich mir das vor. Leider kann man keine 2 Tabellen im Update-Statement eingeben

mkinzler 19. Jul 2007 09:32

Re: Update mit Subselect
 
SQL-Code:
update tabelleB B set B.id_tabelleA=(select A.id_tabelleB where A.id_tabelleA = B.id_tabelleA);

Nico80 19. Jul 2007 09:43

Re: Update mit Subselect
 
Zitat:

Zitat von mkinzler
SQL-Code:
update tabelleB B set B.id_tabelleA=(select A.id_tabelleB where A.id_tabelleA = B.id_tabelleA);

Folgende Fehlermeldung:

The next statement causes the following error:
multiple rows in singleton select

mkinzler 19. Jul 2007 09:46

Re: Update mit Subselect
 
versuchs mal mit distinct oder first 1 im Subquery

Nico80 19. Jul 2007 09:59

Re: Update mit Subselect
 
Zitat:

Zitat von mkinzler
versuchs mal mit distinct oder first 1 im Subquery

Geht nicht.
Ich machs jetzt mit einer Stored Procedure.
Ist zwar blöd, da ich die Procedure nur einmal brauche. Aber was soll's. Dann lösche ich die Procedure nach der Aktualisierung wieder.
Trotzdem Danke!!!

mkinzler 19. Jul 2007 10:01

Re: Update mit Subselect
 
Zitat:

Geht nicht.
Wie meinst du das?

Nico80 19. Jul 2007 10:46

Re: Update mit Subselect
 
Zitat:

Zitat von mkinzler
Zitat:

Geht nicht.
Wie meinst du das?

SQL-Code:
CREATE PROCEDURE CopyIDs
AS
  DECLARE VARIABLE IdTabelleA INTEGER;
  DECLARE VARIABLE IdTabelleBINTEGER;
BEGIN
 FOR SELECT id_tabelleA, id_tabelleB
    FROM tabelleA
    INTO :IdTabelleA , :IdTabelleB
  DO
  BEGIN
    UPDATE tabelleB B SET B.id_tabelleA=:IdTabelleA WHERE id_tabelleB=:IdTabelleB;
  END
END;


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