2011-04-08 3 views
1

Voici le schéma de la base de données: http://i.stack.imgur.com/omX60.pngAide construire une requête (schéma fourni)

Quelle entreprise a le moins de droits?

Dites-moi à quel point ma réponse est erronée.

select top 1 companyName 
serialNumber_tbl as sn, Entitlement_tbl as ent, Company_tbl as c 
where sn.serialNumberId = ent.serialNumberId 
and c.companyId = sn.companyId 
order by count(distinct entitlementId) asc 
group by companyName 

Merci.

Répondre

1

Presque oui, je suppose. Manquant le mot-clé FROM, et GROUP BY doit venir avant ORDER BY.

select top 1 companyName 
from serialNumber_tbl as sn, Entitlement_tbl as ent, Company_tbl as c 
where sn.serialNumberId = ent.serialNumberId 
and c.companyId = sn.companyId 
group by companyName 
order by count(distinct entitlementId) asc 
1
select top 1 companyName 
**from** serialNumber_tbl as sn, Entitlement_tbl as ent, Company_tbl as c 
where sn.serialNumberId = ent.serialNumberId 
and c.companyId = sn.companyId 
group by companyName 
order by count(distinct entitlementId) asc 
1

Les autres réponses ont souligné à juste titre le from manquant mot-clé et le mauvais ordre des clauses group by et order by. Il ne devrait pas y avoir de problème à suivre les conseils que vous avez reçus.

Une autre chose est la syntaxe que vous utilisez pour joindre les tables. Bien que techniquement pas une erreur, il est considéré comme périmé. La nouvelle norme propose des mots-clés dédiés à la jointure, ce qui vous permet de séparer votre logique de jointure de votre logique de filtrage, qui auparavant, selon l'ancienne norme, devait être mélangée dans une clause, la clause WHERE. Permettez-moi de montrer cela en réécrivant pour vous les clauses FROM et WHERE, afin que vous puissiez voir la différence. Tout d'abord, voici votre logique rejoindre la mise en œuvre actuelle:

FROM serialNumber_tbl AS sn, 
    Entitlement_tbl AS ent, 
    Company_tbl AS c 
WHERE sn.serialNumberId = ent.serialNumberId 
    AND c.companyId = sn.companyId 

Les deux conditions dans la clause WHERE sont des conditions de jointure. Voici comment le même fragment de code change lorsque vous avez terminé avec la nouvelle syntaxe:

FROM serialNumber_tbl AS sn 
    INNER JOIN Entitlement_tbl AS ent ON sn.serialNumberId = ent.serialNumberId 
    INNER JOIN Company_tbl AS c ON c.companyId = sn.companyId 

Dans ce cas, la clause WHERE est parti tout à fait, bien sûr, mais vous ne devriez pas avoir la fausse impression qu'il est toujours comme ça . Généralement, la clause WHERE reste valide et utile. S'il contenait d'autres conditions qui ne faisaient pas partie de la logique de jointure, elles conserveraient des emplacements dans la clause WHERE. Je parle de conditions comme ent.Date < '19900101' AND c.CompanyName NOT IN ('IBM', 'Microsoft'). Comme je l'ai dit plus tôt, avec l'ancienne syntaxe que vous utilisez actuellement, cette condition serait dans une clause avec les conditions de jointure. Dans des cas plus simples, comme le vôtre, il pourrait être négligé sans problème, mais dans des requêtes plus complexes, il pourrait devenir un problème, voire un cauchemar, en termes de maintenabilité. Il est donc important de s'habituer à la nouvelle syntaxe avant de commencer à écrire des requêtes aussi complexes.

+0

Merci! J'ai appris quelque chose de nouveau =) – Donut