Hallo Zusammen,
vorab, ich bin sehr neu was Access angeht. Mit Schleifen zu arbeiten funktioniert etwas anders mit dieser SW und ist für mich noch ungewohnt. Um mein Problem zu schildern....
Ich möchte ein neues Feld bestimmen lassen (Bedingung und neuer Wert), bei dem ich eine Distanz anhand Breiten- und Längengrad umrechne. Um es darzustellen, Bestimmung der --> Distanz: "Sqr(71500^2*([a.SITELONGITUDE]-[b.SITELONGITUDE])^2+111300^2*([a.SITELATITUDE]-[b.SITELATITUDE])^2) <= 4000". Es sind zwei Tabellen also habe ich rausgefunden, dass ich mit dem Befehl für join arbeiten muss.
Mein erster SQL-Befehl lautet wie folgt:
SELECT a.ID, b.ID, Sqr(71500^2*([a.SITELONGITUDE]-[b.SITELONGITUDE])^2+111300^2*([a.SITELATITUDE]-[b.SITELATITUDE])^2) AS Dist
FROM a INNER JOIN b ON a.ID = b.ID
WHERE (((Sqr(71500^2*([a.SITELONGITUDE]-[b.SITELONGITUDE])^2+111300^2*([a.SITELATITUDE]-[b.SITELATITUDE])^2))<=4000));
Das Problem ist, dass nur die Distanzen bestimmt werden, sofern die ID der linken Tabelle mit der rechten Tabelle übereinstimmt. Ich beabsichtige eher, dass das ganze wie eine Schleife durchläuft, also der erste ID-Wert der ersten Tabelle soll mit allen Werten der zweiten Tabelle mit der entsprechenden Bedingung durchlaufen und erst dann soll der zweite Wert der ersten Tabelle anlaufen mit den Werten aus der zweiten Tabelle.
Ich habe es versucht wie folgt zu lösen (joint-Befehl " * "):
SELECT * a.ID, b.ID, Sqr(71500^2*([a.SITELONGITUDE]-[b.SITELONGITUDE])^2+111300^2*([a.SITELATITUDE]-[b.SITELATITUDE])^2) AS Dist
FROM a INNER JOIN b ON a.ID = b.ID
WHERE (((Sqr(71500^2*([a.SITELONGITUDE]-[b.SITELONGITUDE])^2+111300^2*([a.SITELATITUDE]-[b.SITELATITUDE])^2))<=4000));
Mit dem ausschließlichen einfügen des Sterns, hat es leider nicht geklappt.
Ich wäre für jede Hilfe sehr dankbar.
Gruß Julian
Hallo, was Du anscheinend erhalten möchtest ist ein Cartesisches Produkt, bei dem jeder Wert der einen Tabelle mit jedem Wert der anderen Tabelle verrechnet wird, habe ich das richtig verstanden? Dann musst Du auf den Join über die IDs verzichten. Hier ein einfaches Beispiel, bei dem die zwei Felder A und B der Tabellen Tab_A und Tab_B miteinander multipliziert werden (Deinen komplexen Ausdruck musst Du selber ergänzen):
SELECT Tab_A.A, Tab_B.B, [A]*[B] AS Produkt
FROM Tab_A, Tab_B;Gruß Thomas
PS: Bitte beachte, dass ein Cartesisches Produkt schnell alle Grenzen sprengt, wenn viele Datensätze vorliegen. Sind in den Tabellen je 1000 Werte enthalten, bekommst Du 1000000 berechnete Werte. Das kann dauern!
Gruß Thomas
Danke für die schnelle Antwort.
SELECT a.ID, b.ID, [a.ID]*[b.ID] AS Distanzen
FROM a, b
WHERE(((SQR(71500^2*([a.SITELONGITUDE]-[b.SITELONGITUDE])^2+111300^2*([b.SITELATITUDE]-[b.SITELATITUDE])^2)<=5000)));
so habe ich deinen Vorschlag umgesetzt, nur lässt sich die Bedingung nicht ganz erfüllen, da mir auch höhere Distanzen >5000 angezeigt werden.
Ich denke dies könnte ein Ansatz sein,
SELECT a.ID, b.ID, Sqr(71500^2*([a.SITELONGITUDE]-[b.SITELONGITUDE])^2+111300^2*([a.SITELATITUDE]-[b.SITELATITUDE])^2) AS Distanzen
FROM a, b
WHERE(((SQR(71500^2*([a.SITELONGITUDE]-[b.SITELONGITUDE])^2+111300^2*([b.SITELATITUDE]-[b.SITELATITUDE])^2)<=5000)));
da er sonst die Bedingung nicht prüft nehme ich an.
Danke für die Hilfestellung, es war definitiv ein Denkanstoß, sonst wäre ich nicht auf diese Lösung gekommen.
Hallo Julian,
Ich bin mir nicht sicher, ob das auch für berechnete Felder gilt oder nur
für Aggregate, aber versuch mal mit HAVING
SELECT a.ID, b.ID, Sqr(71500^2*([a.SITELONGITUDE]-[b.SITELONGITUDE])^2+111300^2*([a.SITELATITUDE]-[b.SITELATITUDE])^2) AS Distanzen
FROM a, b
HAVING Distanzen<=5000
gruss ekkehard
@Eberhard
Bitte nicht schlagen ;)
Zitatsofern die ID der linken Tabelle mit der rechten Tabelle übereinstimmt
Ja, das ist Aufgabe und Wesen eines INNER JOIN.
Für
alle aus A kombiniert mit B würde man einen
LEFT JOIN verwenden.
Schleifen sind in Jet-SQL (der in Access verwendete SQL-Dialekt) nicht möglich.
@ekkehard: Aber dem Kind muss doch geholfen werden.
HAVING ist gedacht zur Filterung von Aggregaten (Summe, Anzahl, Minimum usw.)
Grundlagen - SQL ist leicht (11) - Reihenfolge der Abfrageabarbeitung (https://www.ms-office-forum.net/forum/showthread.php?p=1883328#post1883328)
Danke an alle für die Unterstützung. Mir haben die Tipps geholfen die Lösung zu finden. Dementsprechend kann diese Angelegenheit als abgeschlossen betrachtet werden.
Hallo Eberhard,
Danke für Bestätigung.
gruss ekkehard