Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Access_SQL_join_Berechnung

Begonnen von julian_v_p, Dezember 01, 2020, 15:34:50

⏪ vorheriges - nächstes ⏩

julian_v_p

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

ShenTo19

#1
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

julian_v_p

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.

Beaker s.a.

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  ;)
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

ebs17

#4
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
Mit freundlichem Glück Auf!

Eberhard

julian_v_p

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.

Beaker s.a.

Hallo Eberhard,
Danke für Bestätigung.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)