2010-12-01 11 views
0

Avoir une complète erreur mentale SQL aujourd'hui et ne peut pas comprendre cela. ColdFusion et MS AccessSQL ... Obtenir la valeur de champ basé sur la valeur maximale d'un autre champ

Je cherche à faire une requête de requête dans ColdFusion.

requête d'origine:

<cfquery name="myQuery" datasource="xxx"> 
SELECT Name, ID, tblLoc.Directions, tblLoc.LocationOrder 
FROM myTable 
WHERE .....    
ORDER BY tblLoc.LocationOrder 
</cfquery> 

Je veux créer une autre requête de cette requête où je récupère les directions où LocationOrder est max.

Ainsi, si myQuery retourné:

Name  ID  Directions  LocationOrder 
AA   10   AAAAAA   1 
BB   11   BBBBBB   2 

My QoQ would return: 

Directions 
BBBBBB 

Mais chaque itération d'un SQL simple en apparence que j'ai essayé échoue. Je dois être à moitié endormi ou quelque chose.

<cfquery name="latestDirections" dbtype="query"> 
SELECT Directions 
FROM myQuery 
WHERE LocationOrder=(select max(LocationOrder) from myQuery) 
</cfquery> 

<cfquery name="latestDirections" dbtype="query"> 
SELECT Directions, MAX(LocationOrder) as maxLocationOrder 
FROM get_sel_locations 
</cfquery> 

non non.

+0

Votre premier ressemble à ça devrait fonctionner. 'SELECT Instructions FROM myQuery WHERE LocationOrder = (sélectionnez max (LocationOrder) from myQuery)' –

+0

Je suis d'accord mais j'obtiens cette erreur: Erreur de syntaxe Query Of Queries. Rencontré "LocationOrder = (sélectionnez.Expression conditionnelle incorrecte, Attendue de la condition [like | null | between | in | comparison], – stuttsdc

+1

QoQ ne prend pas en charge ce type de sous-requête. Ils sont en mémoire (et non en base de données) et * seulement * prennent en charge la syntaxe répertoriée dans la documentation. http://livedocs.adobe.com/coldfusion/8/using_recordsets_3.html. – Leigh

Répondre

0
SELECT Name, ID, tblLoc.Directions, tblLoc.LocationOrder 
FROM myTable 
WHERE .....    
ORDER BY tblLoc.LocationOrder DESC LIMIT 1; 

devrait le faire. Vos directions à max LocationOrder est pris en charge par le tri et la limitation.

+0

Vous suggérez un nouveau cfquery et pas une requête de ma requête originale? J'ai besoin de la requête originale telle qu'elle est ... je ne peux pas changer cela pour ajouter cette clause 'order by .... limit 1'. Mais je veux juste récupérer un sous-ensemble de cette requête (directions où l'ordre de localisation est max). – stuttsdc

+0

@stuttsdc: Si vous devez interroger deux fois, ma requête sera beaucoup plus efficace qu'une sous-requête. Mais encore plus efficace est d'utiliser votre requête originale, triée par LocationOrder (soit ASC ou DESC) et extraire Directions à max LocationOrder dans votre couche d'application - vous savez déjà que la première ligne ou la dernière rangée retournée (selon votre tri) contient votre valeur souhaitée. – dnagirl

+0

Mes excuses. Je suis clairement confus. Pourquoi une seconde requête serait-elle plus rapide qu'une QoQ? Quoi qu'il en soit, j'essaie d'imaginer comment je tirerais des directions où l'ordre de localisation est max dans ma couche de l'application. Ce serait évidemment l'emplacement dans la dernière rangée de ma requête puisque j'ai myquery commandé par locationorder. Mais le code cf pour simplement prendre la dernière direction retournée (mis dans une variable w/cfset?) N'est pas clair. Exécuter une boucle? – stuttsdc

0

Une autre possibilité, si je comprends bien la question:

SELECT x FROM nom_de_table y = (SELECT MAX (y) nom_table)

+0

Je peux essayer ceci mais je cherche à faire une requête ou une requête, ainsi 'table_name' doit être le nom de la requête originale. J'ai essayé ceci ci-dessus (dans mon message et dans les commentaires ci-dessus) et j'obtiens une erreur: Erreur de syntaxe Query Of Queries. Rencontré "LocationOrder = (sélectionnez.Expression conditionnelle incorrecte, Attendue de la condition [like | null | between | in | comparison], – stuttsdc

0

Qu'est-ce qui se passe si vous éliminez la clause ORDER BY de myQuery? En outre, dites comment la requête échoue. Quels résultats obtenez-vous?

+1

Il n'y a rien de mal avec myQuery.J'ai besoin de cette requête telle quelle, puisque j'utilise les résultats Je cherche à lancer une requête sur cette requête, donc la requête d'origine fonctionne très bien, je n'obtiens aucun résultat avec les autres requêtes comme indiqué ci-dessus. "LocationOrder = (sélectionnez Expression conditionnelle incorrecte, Une condition de [like | null | between | in | comparaison] attendue,". La seconde, "Column get_sel_locations.Directions n'est pas valide dans la clause SELECT, car elle n'est pas contenue dans un fonction d'agrégat et il n'y a pas de clause GROUP BY " – stuttsdc

+0

Je n'ai pas dit ou laissé entendre qu'il y avait quelque chose de" faux "avec myQuery, j'ai demandé ce qui se passe si vous supprimez la clause order by.Les erreurs que vous obtenez semblent fausses et je voulais pour voir si l'ordre avait quelque chose à voir avec ça. – Tim

+0

ah ... Je vais vérifier ça ... – stuttsdc

0

Compte tenu de l'erreur que vous obtenez, vous pouvez essayer ceci:

-- remove the parentheses 
WHERE LocationOrder=select max(LocationOrder) from myQuery   

ou

-- use IN instead of equals even though your subquery returns a single scalar value and '=' should be fine. 
WHERE LocationOrder IN (select max(LocationOrder) from myQuery) 
1

...The second, "Column get_sel_locations.Directions is invalid in the SELECT list clause because it is not contained in an aggregate function and there is no GROUP BY clause"

L'erreur est assez claire. Il vous manque la clause GROUP BY. Lorsque vous utilisez des agrégats comme MAX() vous devez GROUP les résultats par des colonnes non agrégées. Dans ce cas: Indications

SELECT Directions, MAX(LocationOrder) as maxLocationOrder 
FROM get_sel_locations 
GROUP BY Directions 

Mise à jour Mais si vous voulez juste le maximum pour tout, puis la requête Yisroel est probablement ce que vous voulez.

Mise à jour Comme mentionné dans les commentaires, en glissement trimestriel sont pas requêtes de base de données. Ils prennent en charge que les fonctions/syntaxe figurant dans la documentation http://livedocs.adobe.com/coldfusion/8/using_recordsets_3.html

0

Vous pouvez d'abord faire un glissement trimestriel pour obtenir l'emplacement max

<cfquery name="maxDirections" dbtype="query"> 
    SELECT max(LocationOrder) as maxLocation 
    FROM myQuery 
</cfquery> 

<cfquery name="latestDirections" dbtype="query"> 
    SELECT Directions 
    FROM myQuery 
    WHERE LocationOrder = '#maxDirections.maxLocation#' 
</cfquery> 
Questions connexes