Mailinglisten-Archive |
Ich habe diese beiden Beispieltabellen:
#
# Table structure for table 'dom'
#
CREATE TABLE dom (
id int(11),
domain varchar(127)
);
#
# Dumping data for table 'dom'
#
INSERT INTO dom VALUES (1,'netuse.de');
INSERT INTO dom VALUES (2,'koehntopp.de');
#
# Table structure for table 'host'
#
CREATE TABLE host (
ip varchar(16),
hostname varchar(127),
id int(11)
);
#
# Dumping data for table 'host'
#
INSERT INTO host VALUES ('193.98.110.1','nuki.netuse.de',0);
INSERT INTO host VALUES ('193.102.57.4','white.koehntopp.de',0);
INSERT INTO host VALUES
('192.102.57.3','valiant.koehntopp.de',0);
Ich muß eine große Menge externe Daten in die "host"-Tabelle
laden (etwa 7200 Domains mit entsprechend mehr Rechnern). Ich
kann bereits erfolgreich den folgenden Join ausführen, der genau
das tut, was ich möchte (nur sehr langsam ist):
mysql> select concat("%.", dom.domain) as bla from dom;
+----------------+
| bla |
+----------------+
| %.netuse.de |
| %.koehntopp.de |
+----------------+
2 rows in set (0.00 sec)
mysql> select dom.id, domain, hostname from dom, host where
host.hostname like concat("%.", dom.domain);
+------+--------------+----------------------+
| id | domain | hostname |
+------+--------------+----------------------+
| 1 | netuse.de | nuki.netuse.de |
| 2 | koehntopp.de | white.koehntopp.de |
| 2 | koehntopp.de | valiant.koehntopp.de |
+------+--------------+----------------------+
3 rows in set (0.01 sec)
Der Join ist langsam, weil er mit Pattern Matching mit führendem
Wildcard arbeitet, also durch Indices nicht beschleunigt werden
kann. ch möchte jetzt "id"-Werte in "host" so berechnen, daß sie
stattdessen als foreign key zum Join verwendet werden können.
Mein Versuch:
mysql> update host set host.id = dom.id
> where host.hostname like concat("%.", dom.domain);
ERROR 1109: Unknown table 'dom' in field list
Das scheitert also am "host.id = dom.id"-Part der Query. Wir kann
ich die host.id-Werte korrekt berechnen, sodaß ihre Werte gemäß
den dom.id-Werten gesetzt werden.
Mir ist klar, daß es eine Prozedurale Lösung gibt. Die Frage ist:
Gibt es eine SQL-Lösung für dieses Problem? Wenn nein, warum
nicht?
Kristian
--
Kristian Köhntopp, NetUSE Kommunikationstechnologie GmbH
Siemenswall, D-24107 Kiel, Germany, +49 431 386 436 00
Using PHP3? See our web development library at
http://phplib.shonline.de/ (GPL)
php::bar PHP Wiki - Listenarchive