J'utilise mssql et j'ai du mal à utiliser une sous-requête. La vraie requête est assez compliquée, mais elle a la même structure que celle-ci:
select customerName, customerId, ( select count(*) from Purchases where Purchases.customerId=customerData.customerId ) as numberTransactions from customerData
Et ce que je veux faire est de order la table par le nombre de transactions, mais quand j'utilise
order by numberTransactions
Il me dit qu'il n'y a pas un tel champ. Est-il possible de faire cela? Devrais-je utiliser une sorte de mot-key spécial, tel que this
, ou self
– self
?
utilisez le numéro de champ, dans ce cas:
order by 3
Parfois, vous devez vous battre avec la syntaxe de SQL (scope attendue des clauses)
SELECT * FROM ( select customerName, customerId, ( select count(*) from Purchases where Purchases.customerId=customerData.customerId ) as numberTransactions from customerData ) as sub order by sub.numberTransactions
En outre, une solution utilisant JOIN est correcte. Regardez le plan de requête, SQL Server devrait donner des plans identiques pour les deux solutions.
Faites une jointure interne. C'est beaucoup plus facile et plus lisible.
select customerName, customerID, count(*) as numberTransactions from customerdata c inner join purchases p on c.customerID = p.customerID group by customerName,customerID order by numberTransactions
select customerName, customerID, count(*) as numberTransactions from customerdata c inner join purchases p on c.customerID = p.customerID group by customerName,customerID order by numberTransactions
EDIT: Salut Nathan,
Vous réalisez que vous pouvez vous joindre à toute la table en tant que sous-droite?
Select T.*, T2.* From T inner join (select customerName, customerID, count(*) as numberTransactions from customerdata c inner join purchases p on c.customerID = p.customerID group by customerName,customerID ) T2 on T.CustomerID = T2.CustomerID order by T2.numberTransactions
Ou si ce n'est pas bon, vous pouvez build vos requêtes en utilisant des tables temporaires (# T1 etc)
Il existe de meilleurs moyens d'get votre résultat, mais à partir de votre exemple de requête cela fonctionnera sur SQL2000 ou mieux.
Si vous encapsulez votre alias en single ticks 'numberTransactions' , puis appelez ORDER BY 'numberTransactions'
select customerName, customerId, ( select count(*) from Purchases where Purchases.customerId=customerData.customerId ) as 'numberTransactions' from customerData ORDER BY 'numberTransactions'
La même chose pourrait être réalisée en utilisant GROUP BY
et un JOIN
, et vous serez débarrassé de la sous-requête. Cela pourrait être plus rapide aussi.
Je pense que vous pouvez le faire dans SQL2005, mais pas SQL2000.
Vous devez dupliquer votre logique. SQL Server n'est pas très intelligent sur les colonnes que vous avez nommées mais ne fait pas partie de l'set de données dans votre instruction FROM.
Alors utilisez
select customerName, customerId, ( select count(*) from Purchases p where p.customerId = c.customerId ) as numberTransactions from customerData c order by (select count(*) from purchases p where p.customerID = c.customerid)
En outre, utilisez des alias, ils facilitent la lecture et la maintenance de votre code. 😉