# update: zwei Datenbanken, zwei Tabellen



## starter_de (20. August 2004)

Hallo.

Ich habe:
- zwei Datenbanken mit je einer Tabelle

Ich will:
1. die Datensätze der beiden Tabellen werden miteinander verglichen.
2. bei identischen Datensätzen wird in der ersten Spalte der ersten Tabelle ein Wert aus der zweiten Tabelle übernommen.

Ich habe es mit dem folgenden Code probiert, jedoch erfolglos. 

```
update db1.tab1 a
set a.feld1 = b.feld3 
where (
select b.feld3 
from db1.tab1 a, db2.tab2 b 
where a.feld2 = b.feld2 
AND a.feld3 = b.feld3
)
```

Über Umwege, indem ich den Code in zwei Einzelschritten aufteile (update und select getrennt), klappt es zwar, aber es ist halt keine elegante Lösung.

Nach Möglichkeit möchte ich keinen php-Script benutzen.

Habt Ihr eine Idee?


----------



## Thomas Darimont (20. August 2004)

Hallo!

Welches  Datenbankmanagementsystem verwendest du?

Gruß Tom


----------



## starter_de (20. August 2004)

habe ich doch tatsächlich vergessen anzugeben:
mySQL 4er-Version


----------



## Gorcky (22. August 2004)

Ist vielleicht noch etwas umständlich aber so sollte es eigentlich gehen:
	
	
	



```
update db1.tab1 a
set a.feld1 = (
select b.feld3 
from db2.tab2 b 
where a.feld2 = b.feld2 
AND a.feld3 = b.feld3)
where EXISTS(
select b.feld3 
from db2.tab2 b 
where a.feld2 = b.feld2 
AND a.feld3 = b.feld3
)
```


----------



## starter_de (22. August 2004)

Danke für die Antwort, aber leider bekomme ich bei Deinem Code ebenfalls einen Syntaxfehler angezeigt.
Kann man überhaupt den Befehlt update über zwei Datenbanken nutzen?


----------



## Gorcky (22. August 2004)

Was für einen Syntaxfehler denn?
Wäre schön wenn Du den immer gleich mit postest.
Mir fällt gerade ein, er könnte meckern, dass mit dem Select im SET mehr als ein Wert (eine Tabelle) zurückgegeben wird. Da könnte ein DISTINCT abhelfen:
	
	
	



```
...
set a.feld1 = (
select DISTINCT b.feld3
...
```
 mySQL 4 sollte ja ansich Subqueries unterstützen.
Und Du Updatest ja nur eine Tabelle - auch wenn Du Dir dazu informationen aus einer zweiten holst.
Ansonsten poste doch einfach mal immer die Fehlerbeschreibung mit.


----------



## Thomas Darimont (22. August 2004)

Hallo!

Subquerys werden leider erst ab MySQL 4.1 unterstützt:



> Starting with MySQL 4.1, all subquery forms and operations that the SQL standard requires are supported, as well as a few features that are MySQL-specific.


http://dev.mysql.com/doc/mysql/en/Subqueries.html

Zum Updaten meherer Tabellen gleichzeitig siehe:


> Starting with MySQL 4.0.4, you can also perform UPDATE operations that cover multiple tables:
> 
> UPDATE items,month SET items.price=month.price
> WHERE items.id=month.id;


http://dev.mysql.com/doc/mysql/en/UPDATE.html

Gruß Tom


----------



## starter_de (22. August 2004)

Nochmals danke für die Antworten.

Was den Syntaxfehler betrifft: 
"[localhost] FEHLER 1064: You have an error in your SQL syntax.  Check the manual that corresponds to your MySQL server version for the right syntax to use near 'select a.id,a.ps,b.temp7 as variable from ppdb.ptab1 a
inner"

Naja, diese Aussage hilft mir nicht entscheidend weiter.

Aber nicht so schlimm, weil ich jetzt beschlossen habe, die zu Beginn erwähnte update-Query in zwei Schritten zu machen (zuerst mit select eine extra Tabelle erstellen, dann erst updaten - nicht elegant, aber es geht.)

Aber eine anschliessende Frage: 
Es handelt sich bei mir um zwei Tabellen mit jeweils ca. 150.000 Datensätze, die wie gesagt, verglichen werden müssen. 

Alleine diese Query hat auf meinem Rootserver 11 Stunden  gebraucht. Ist das bei der Menge normal? Es müsste doch schneller gehen...

```
CREATE TABLE IF NOT EXISTS db1.tab2;
select a.feld1,a.feld2,b.feld1 from db1.tab1 a
inner join db2.tab2 b
on a.feld1 = b.feld1
AND a.feld2 = b.feld2
WHERE a.feld3 = b.feld3
```

Habt Ihr eine Idee?


----------



## starter_de (24. August 2004)

```
create...
select b.feld3 
from db1.tab1 a, db2.tab2 b 
where a.feld2 = b.feld2 
AND a.feld3 = '1'
AND b.feld3 = '1'

insert...
select b.feld3 
from db1.tab1 a, db2.tab2 b 
where a.feld2 = b.feld2 
AND a.feld3 = '2'
AND b.feld3 = '2'
```

Durch die Zuweisung von Konstanten in der WHERE-Bedingung konnte ich  die Abfrage um fast Faktor 6 beschleunigen (zuvor über 11 Stunden bei ca. 150.000 Datensätze und jetzt knapp 2 Stunden).

Natürlich muss man das Glück haben Konstanten in Tabellen zu haben, die man sinnvoll einsetzen kann.


----------



## Dragon_MG (25. August 2004)

Also ich hoffe jetzt das ich die Frage nicht falsch verstanden hab. Wenn nicht wie wäre es denn dann mit diesem Code:


```
Update t1
   set t1.feld1 = b.feld3
  FROM db1.tab1 t1 INNER JOIN db2.tab2 t2
                      ON t1.feld2 = t2.feld2
                     AND t1.feld3 = t2.feld3
```

Ich weis nicht genau ob es funktioniert im 4.0, weil ich keinen zum testen hab und mir nicht sicher bin ob JOINs schon benutzt werden können.

MFG Dragon


----------

