ottscho
Goto Top

AS Syntax - MSSQL

Hallo,

ich versuche ein SQL Befehl an die DB zu schicken.
SELECT [AccountId], ( 6371 * acos( cos( radians(37) ) * cos( radians( [New_latitude] ) ) * cos( radians( [New_longitude] ) - radians(-122) ) + sin( radians(37) ) * sin( radians( [New_latitude] ) ) ) ) AS distance FROM [tw_elektric_MSCRM].[dbo].[Account] HAVING distance < 25 ORDER BY distance

Leider kommt due Meldung, dass das Feld distance nicht vorhanden ist.
Ich lege dies ja auch nur virtuell mit AS an.

Was mache ich falsch?

Danke

Gruß
ottscho

Content-Key: 144651

Url: https://administrator.de/contentid/144651

Printed on: April 20, 2024 at 02:04 o'clock

Member: AndreasHoster
AndreasHoster Jun 11, 2010 at 10:12:21 (UTC)
Goto Top
Soweit ich weiß gehts mit dem Anzeigenamen nicht, aber man kann auch die Spalte angeben, nach der Sortiert werden soll (bei Dir die 2. Spalte):
SELECT [AccountId], ( 6371 * acos( cos( radians(37) ) * cos( radians( [New_latitude] ) ) * cos( radians( [New_longitude] ) - radians(-122) ) + sin( radians(37) ) * sin( radians( [New_latitude] ) ) ) ) AS distance FROM [tw_elektric_MSCRM].[dbo].[Account] HAVING distance < 25 ORDER BY 2
Member: ottscho
ottscho Jun 11, 2010 at 10:18:28 (UTC)
Goto Top
geht leider nicht:

[code]
SELECT [AccountId], ( 6371 * acos( cos( radians(37) ) * cos( radians( [New_latitude] ) ) * cos( radians( [New_longitude] ) - radians(-122) ) + sin( radians(37) ) * sin( radians( [New_latitude] ) ) ) ) AS distance FROM [tw_elektric_MSCRM].[dbo].[Account] HAVING 2 < 25 ORDER BY 2
[/code]

Fehler:
Die 'tw_elektric_MSCRM.dbo.Account.AccountId'-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.
Member: ottscho
ottscho Jun 11, 2010 at 11:24:47 (UTC)
Goto Top
Ich habe noch dies gefunden:

•Einem Ausdruck select_expr lässt sich mit AS alias_name ein Alias zuweisen. Der Alias wird als Spaltenname des Ausdrucks benutzt und kann in GROUP BY-, ORDER BY- oder HAVING-Klauseln verwendet werden. Zum Beispiel:
SELECT CONCAT(last_name,', ',first_name) AS full_name
FROM mytable ORDER BY full_name;
Das Schlüsselwort AS ist beim Zuweisen eines Alias zu select_expr optional. Das obige Beispiel hätte auch wie folgt geschrieben sein können:
SELECT CONCAT(last_name,', ',first_name) full_name
FROM mytable ORDER BY full_name;
Allerdings kann, weil AS optional ist, ein kleines Problem auftreten, wenn Sie das Komma zwischen zwei select_expr-Ausdrücken vergessen: MySQL interpretiert den zweiten Ausdruck als Aliasnamen. Sie wird etwa in der folgenden Anweisung columnb als Aliasname behandelt:
SELECT columna columnb FROM mytable;
Aus diesem Grund hat es sich bewährt, AS beim Festlegen von Spaltenaliasen immer explizit anzugeben.


Also sollte es eig. ja funktionieren
Member: db-wizard
db-wizard Jun 11, 2010 at 11:33:54 (UTC)
Goto Top
Zitat von @ottscho:
Also sollte es eig. ja funktionieren


--> HAVING distance < 25 ORDER BY distance

Warum benutzt du HAVING, wenn du keine GROUP BY CLAUSE verwendest ? Versuche es mal mit einer "normalen" WHERE CLAUSE, HAVIN OHne ein GROUP BY wirft dir einen Fehler

--> WHERE distance < 25 ORDER BY distance
Member: AndreasHoster
AndreasHoster Jun 11, 2010 at 11:36:56 (UTC)
Goto Top
OK, ich habe gar nicht gesehen, daß distance auch in dem HAVING Vergleich drin ist.
So gehts nur beim Order By.
Für den Having Eintrag muss ich nochmals nachdenken.
Member: db-wizard
db-wizard Jun 11, 2010 at 11:42:02 (UTC)
Goto Top
Zitat von @AndreasHoster:
Für den Having Eintrag muss ich nochmals nachdenken.


Na ja...HAVING ist hier einfach ...falsch face-smile...Hast du es mal mit einem WHERE probiert ?.. BTW, welche DB hast du eigentlich ? Im Titel steht MSSQL, aber du zitierst aus dem MYSQL Handbuch ?

Gruss
Member: ottscho
ottscho Jun 11, 2010 at 11:50:24 (UTC)
Goto Top
sooo, ich habe versucht dies in ASP umzusetzen:

http://code.google.com/intl/de-DE/apis/maps/articles/phpsqlsearch.html

Das habe ich übernomme, daher kommt auch der SQL Befehl.

Ich habe es nun so:
SELECT [name], ( 6371 * acos( cos( radians(48.06223) ) * cos( radians( [New_latitude] ) ) * cos( radians( [New_longitude] ) - radians(8.52301) ) + sin( radians(48.06223) ) * sin( radians( [New_latitude] ) ) ) ) AS distance FROM [tw_elektric_MSCRM].[dbo].[Account] WHERE 2 < 25 ORDER BY 2


Hier erhalte ich nun ein Ergebnis.
Leider stimmt das Ergebnis nicht!
Oder ich habe einen denkfehler. Es sollte nur alle angezeigt werden, welche bei Distanz unter 25 haben.
Leider werden aber alle Datensätze angezeigt. Das liegt bestimmt an der Formatierung...

Siehe Screenshot:

http://www.myimg.de/?img=bild5e184.jpg
Member: db-wizard
db-wizard Jun 11, 2010 at 12:04:30 (UTC)
Goto Top
Hallo,

Ich kenne MSSQL gar nicht, aber in Oracle kannst du keinen ALIAS im WHERE verwenden in deinem Fall. Du musst als im WHERE die Berechnung nochmals aufführen. Der Grund ist, das das Filtern über die WHERE Clause vor der Berechnung des SELECT Statements erfolgt.

SELECT [name], ( 6371 * acos( cos( radians(48.06223) ) * cos( radians( [New_latitude] ) ) * cos( radians( [New_longitude] ) - radians(8.52301) ) + sin( radians(48.06223) ) * sin( radians( [New_latitude] ) ) ) ) AS distance 
FROM [tw_elektric_MSCRM].[dbo].[Account] 
WHERE ( 6371 * acos( cos( radians(48.06223) ) * cos( radians( [New_latitude] ) ) * cos( radians( [New_longitude] ) - radians(8.52301) ) + sin( radians(48.06223) ) * sin( radians( [New_latitude] ) ) ) )  < 25 
ORDER BY 2

Gruss
Member: AndreasHoster
AndreasHoster Jun 11, 2010 at 12:28:44 (UTC)
Goto Top
Man sollte immer alles durchlesen face-wink

Having ohne group By geht tatsächlich nicht und where 2 < 25 ist natürlich nicht richtig, weil immer wahr.
Und man kann nur bei order by die Spaltennummer angeben.

So wie es db-wizard gemacht hat, sollte es tun.
Laut MSSQL Handbuch sollte aber auch Deine Variante mit dem Aliasnamen tun.
Member: ottscho
ottscho Jun 11, 2010 at 12:34:05 (UTC)
Goto Top
die Variante mit den ALIAS Namen geht leider nicht.
Aber die von db-wizard funktioniert face-smile

Vielen Dank
Member: Biber
Biber Jun 11, 2010 at 15:24:09 (UTC)
Goto Top
Moin alle,

die Varianten mit ALIAS und der unkonventionellen Interpretation (oder Implementierung) der HAVING-Clause funktionieren in der Tat nur unter mySQL.

Und das steht auch dort ein bisschen versteckt im Handbuch, so als wären doe Entwickler sich nicht ganz sicher, ob sie da nun stolz drauf sein dürften.

[Zitat]
...
{zum Thema AS - Aliase in GROUP BY/Having verwenden}
Einem Ausdruck select_expr lässt sich mit AS alias_name ein Alias zuweisen. Der Alias wird als Spaltenname des Ausdrucks benutzt und kann in GROUP BY-, ORDER BY- oder HAVING-Klauseln verwendet werden
....
...
{zum Thema HAVING auf NICHT-GROUP-BY-Spalten]
...
Die HAVING-Klausel wird fast als Letztes angewandt – unmittelbar bevor die Elemente an den Client gesendet werden, und ohne Optimierung. (Nur LIMIT wird noch nach HAVING angewandt.)

Der SQL-Standard sieht vor, dass HAVING nur Spalten in der GROUP BY-Klausel oder solche Spalten referenzieren darf, die in Zusammenfassungsfunktionen verwendet werden. Allerdings unterstützt MySQL eine Erweiterung dieses Verhaltens und gestattet HAVING ferner die Referenzierung von Spalten in der SELECT-Liste und Spalten in äußeren Unterabfragen. 
...
[/Zitat]
Quelle: Ein willkürlich herausgegriffenes mySQL-Manual

--> Das ist je nach Sichtweise
a) ein nützliches Feature
b) absolut indiskutabel, weil strunzinkompatibel, sollte jemals das darunterliegende Datenbankblech geändert/getauscht werden.
Und es verstehen ncht mal SQL-Kundige, warum es funktioniert haben könnte.

Meine Sichtweise tendiert eindeutig zu b).. BTW haben wir uns ja gerade wegen dieser Inkompatibilität hier im Thread getroffen.

A propos Inkompatibilitäten:

könntet ihr bei Gelegenheit (in der Halbzeitpause oder so) bitte noch ein bisschen nach-editieren auf ?
Und evt. auch ein paar gezielte Zeilenumbrüche reinhacken in das Statement, das sonst nur ein 32-Bit-Parser zu lesen gewillt wäre?
Oder ein Biber nach 32 Bit?

Grüße
Biber