2010-03-07 5 views
0

Je reçois une syntaxe incorrecte près du mot-clé 'select' après l'exécution du code suivant.Syntaxe incorrecte près du mot-clé 'select' lors de l'exécution de la requête

declare @c int 

SELECT @c = COUNT(*) 
    FROM (select id, max(date_stored) 
     from table B 
    INNER JOIN table P ON B.id = P.id 
     where id = 3) 

select @c 

Je veux sélectionner le nombre total d'enregistrements ayant des dates de stockage maximum dans la base de données. Quelqu'un peut-il plz dire ce que je fais mal

+0

Il défaites le but des alias de table si vous ne les utilisez pas systématiquement. De quelle table provient la valeur 'id', car ne pas spécifier produira une erreur de" référence de colonne ambiguë "vu que la colonne existe dans les deux tables. –

Répondre

0
declare @c int 
SELECT @c = COUNT(aName.[ID]) FROM 
(
    select [B.id], max(B.date_stored) 
    from table B 
    INNER JOIN table P ON B.id = P.id 
    where B.id = 3 
    -- group by [id] ??? 
) aName 

select @c 
+0

Résolu le problème en définissant simplement max (B.date_stored) comme MaxDate – sam

0
SET @C = SELECT COUNT(*) FROM ... 

Aussi, avez-vous besoin de faire un GROUP BY dans cette SELECT intérieure? Que veut dire l'appel "max()"? Dans quelle table se trouve ce champ "date_stored"? Je pense que vous devriez obtenir cette requête interne d'abord, puis passer à l'obtention des comptes. Si vous essayez de comptabiliser des enregistrements dont la valeur de date est égale à la plus récente de toutes les valeurs de date pour une valeur "id" donnée, vous devrez rendre cela explicite (sauf si SQL Server 2005 a une nouvelle fonctionnalité soignée que je ne connais pas).

+0

Avez-vous essayé votre code? (Cela peut être une question rhétorique.) –

+0

max (date_stored) est utilisé pour compter uniquement le dernier date_stored pour un ID donné, en supposant qu'il y ait plus d'une ligne pour chaque ID. date_stored est dans le tableau b. aussi un alias de table, quand vous faites une jointure, vous devez identifier quelle colonne vous référencez. –

+0

@joe oui chaque identifiant a plus de colonnes pour la date ..soi je veux juste obtenir la colonne date max. Mais cela ne marchera toujours pas ... Après avoir défini un alias, il est dit qu'aucune colonne n'a été spécifiée pour la colonne 2 de 'aName' – sam

1

vous devez créer un alias de la sous-requête

declare @c int 
SELECT @c = COUNT(*) FROM 
(
    select id, max(date_stored) 
    from 
    table B 
    INNER JOIN 
    table P 
    ON 
    B.id = P.id 
    where 
    id = 3 
) x --alias 
select @c 

Je ne comprends toujours pas pourquoi jouets font le groupe par et au maximum dans la sous-requête si vous avez besoin est un compte

+0

Pourquoi aurait-il besoin de pseudo la sous-requête ?? – Pointy

+0

@Pointy: Parce que c'est ainsi que fonctionne TSQL et pourquoi il a eu l'erreur. – Hogan

+0

Le De du premier select a besoin de l'alias –

Questions connexes