2010-10-13 5 views
1

Je semble avoir du mal à saisir le concept de l'utilisation de AS pour créer un alias, puis d'utiliser cet alias plus tard. Voici un exemple d'une requête très simple que je reçois une erreur quand je lance:sql en utilisant des alias

SELECT IP, 
     (SELECT server_ip as IP 
      FROM table1 
     WHERE start_time BETWEEN @startdate AND @enddate 
     Group By server_ip)X 
Group By IP 

j'attendre à ce que les résultats juste retour de la seconde instruction select dans la colonne server_ip. Cependant, je reçois un message d'erreur indiquant que IP n'est pas un nom de colonne invalide. Quelqu'un peut-il m'expliquer comment le faire correctement?

Répondre

1
SELECT IP, 
    (
    SELECT server_ip as IP 
    FROM table1 
    WHERE start_time BETWEEN @startdate AND @enddate 
    Group By server_ip 
    )X 
/*FROM WHERE ? <--------------- */ 
Group By IP 

Votre déclaration SELECT au moment est

SELECT IP, X 
GROUP BY IP 

Vous avez besoin d'une clause FROM. X est une sous-requête non corrélée pour le moment. Je soupçonne que vous vouliez le traiter comme une table dérivée, mais même alors, la requête n'a aucun sens. Il n'est pas nécessaire d'effectuer deux fois la même action GROUP BY. En fonction de votre SGBDR, vous pouvez également utiliser des expressions de table communes. Voici un exemple un peu artificiel de leur utilisation.

;WITH X AS 
(
    SELECT server_ip as IP 
    FROM table1 
    WHERE start_time BETWEEN @startdate AND @enddate 
), 
Y AS 
(
    SELECT IP 
    FROM X 
    Group By IP 
) 
SELECT IP 
FROM Y 
+0

merci;) apprécier l'aide – MilqueToasted

+0

@MilqueToasted - Êtes-vous sur S QL Server 2005+? Si c'est le cas, consultez également les expressions de table communes. –

+0

Oracle 9i + (et PostgreSQL 8.4+) prend en charge WITH, ainsi que DB2 et Firebird (versions dunno). –

1

Vous avez été absent la clause FROM:

SELECT x.ip 
    FROM (SELECT server_ip as IP 
      FROM table1 
      WHERE start_time BETWEEN @startdate AND @enddate 
     GROUP BY server_ip) AS x 
GROUP BY x.ip 

Comme il est, il vous suffit d'utiliser:

SELECT server_ip as IP 
    FROM table1 
    WHERE start_time BETWEEN @startdate AND @enddate 
GROUP BY server_ip 
+0

oh garçon est-ce que je me sens stupide..missing the. Je me rends compte que le deuxième choix est inutile, mais j'avais des problèmes avec les alias et les requêtes plus complexes, alors j'ai décidé de le rendre aussi simple que possible et de construire. Merci pour l'aide tous :) – MilqueToasted

+0

SELECT DISTINCT évite le besoin de GROUP BY. Nous avons corrigé sa requête ... quelqu'un d'autre devra l'aider avec des alias. – kevpie

0

vous devez utiliser mot-clé AS befor votre nouveau nom pour l'attribution d'une alias à une table de temp ou une colonne ou etc.

+1

Dépend de la base de données - 'AS' peut être optionnel. IE: Oracle, SQL Server ... –