2012-07-14 6 views
0

Je dois trier les résultats d'une requête après avoir inséré une valeur dans une variable. J'essaye de trier selon 'RowId' mais ce n'est pas valide dans mon cas.
Voici ma question, comment puis-je le faire fonctionner? Merci.SQL Server, insérer la valeur dans la variable et trier

SELECT TOP 1 @NumOfProducts = ROW_NUMBER() OVER(ORDER BY Products.Id) AS RowId 
     FROM   Cities INNER JOIN 
         CitiesInLanguages ON Cities.Id = CitiesInLanguages.CityId INNER JOIN 
         ShopsInCities ON Cities.Id = ShopsInCities.CityId INNER JOIN 
         Categories INNER JOIN 
         ProductstInCategories ON Categories.Id = ProductstInCategories.CategoryId INNER JOIN 
         Products ON ProductstInCategories.ProductId = Products.Id INNER JOIN 
         ProductsInProdutGroup ON Products.Id = ProductsInProdutGroup.ProductId INNER JOIN 
         ProductsGroups ON ProductsInProdutGroup.ProductGroupId = ProductsGroups.Id INNER JOIN 
         ShopsInProductsGroup ON ProductsGroups.Id = ShopsInProductsGroup.ProductGroupId INNER JOIN 
         aspnet_Users ON ShopsInProductsGroup.ShopId = aspnet_Users.UserId ON ShopsInCities.ShopId = aspnet_Users.UserId INNER JOIN 
         ProductsNamesInLanguages ON Products.Id = ProductsNamesInLanguages.ProductId INNER JOIN 
         UsersInfo ON aspnet_Users.UserId = UsersInfo.UserId INNER JOIN 
         ProductOptions ON Products.Id = ProductOptions.ProductId INNER JOIN 
         ProductOptionsInLanguages ON ProductOptions.Id = ProductOptionsInLanguages.ProductOptionId INNER JOIN 
         ProductFiles ON Products.Id = ProductFiles.ProductId INNER JOIN 
         ProductsInOccasions ON Products.Id = ProductsInOccasions.ProductId INNER JOIN 
         Occasions ON ProductsInOccasions.OccasionId = Occasions.Id INNER JOIN 
         OccasionsInLanguages ON Occasions.Id = OccasionsInLanguages.OccasionId 
WHERE  (Products.IsAddition = 0) AND (Categories.IsEnable = 1) AND (Products.IsEnable = 1) AND (ProductsGroups.IsEnable = 1) AND (Cities.IsEnable = 1) AND 
         (ShopsInProductsGroup.IsEnable = 1) AND (CitiesInLanguages.CityName = @CityName) AND (ProductsNamesInLanguages.LanguageId = @languageId) AND 
         (Categories.Id = @CategoryId) AND (ProductOptions.IsEnable = 1) AND (ProductFiles.IsEnable = 1) 
         group by Products.Id, ProductsNamesInLanguages.ProductName, UsersInfo.Name 
         Order By RowId 

Répondre

1

Avec modifier, essayez ceci:

SELECT TOP 1 @NumOfProducts = ROW_NUMBER() OVER(ORDER BY Products.Id), 
           ROW_NUMBER() OVER(ORDER BY Products.Id) AS RowId 

ou essayez

ORDER BY ROW_NUMBER() OVER(ORDER BY Products.Id) 

Je dois tester mais je thik les deux fonctionneront.


Le problème est que rowid ne fait partie d'aucun élément du groupe. Il est possible de commander par Products.id. Si rowid va être le même pour chacun, vous pouvez commander par max(rowid) ou min(rowid) ou ajouter rowid à l'instruction group by.

+0

Désolé, j'ai oublié d'ajouter le @NumOfProducts qui causent tout le problème. – Eyal

+0

Ce n'est pas un SQL valide que vous ne pouvez pas affecter à une variable et lui donner un alias. Mais je pense que vous pouvez simplement mettre ROW_NUMBER() OVER (ORDER BY Products.Id) 'après le' ORDER BY' – Hogan

+0

Merci beaucoup! – Eyal

1

Essayez-vous de trouver l'ID de la dernière ligne insérée? Vous voulez

SELECT Scope_Identity() 

Modifier * Je suis en train d'obtenir l'ID de ligne max de ROW_NUMBER() *

Enveloppez votre requête dans

SELECT @NumOfProducts = Max(RowID) FROM 
([your query here]) v 

Alternativement, un SELECT COUNT ... requête peut fournir la réponse

+0

Désolé, j'ai oublié d'ajouter le @NumOfProducts qui causent tout le problème. – Eyal

+0

Non, j'essaie d'obtenir l'identifiant max row de ROW_NUMBER(). le problème est que je ne peux pas trier en essayant d'obtenir la valeur @NumOfProducts. – Eyal

Questions connexes