2012-08-16 2 views
0

Lorsque j'écris ci-dessous une requête, elle renvoie tous les ensembles de temps différents.Inner Join renvoie différents ensembles de données

SELECT title, content FROM Stack 
INNER JOIN Overflow ON Stack.OverflowId = Overflow.Id 

Par exemple;

résultat souhaité:

title content 
_____ _______ 
a  - c1 
b  - c2 
c  - c3 
d  - c4 
e  - c5 
f  - c6 
g  - c7 

Première course:

title content 
_____ _______ 
g  - c7 
d  - c4 
c  - c3 
b  - c2 
f  - c6 
e  - c5 
a  - c1 

Deuxième course:

title content 
_____ _______ 
d  - c4 
a  - c1 
f  - c6 
b  - c2 
g  - c7 
e  - c5 
c  - c3 

C'est une réalité intéressante pour moi .. Savez-vous la raison?

Lorsque j'utilise la requête ci-dessous, c'est OK.

SELECT title, content FROM Stack 
INNER JOIN Overflow ON Stack.OverflowId = Overflow.Id 
ORDER BY Stack.Id 

Mais la question est

Pourquoi ai-je besoin pour obtenir ORDER BY résultat désiré?

+2

Parce que si vous ne spécifiez pas une commande DB retournera les résultats dans un ordre imprévisible. Pourquoi la performance de la DB devrait-elle être sur une commande supposée chaque fois que vous n'en avez pas spécifié une? –

Répondre

2

Vous ne pouvez pas attendre une commande prévisible sans ORDER BY. Sans cela, vous n'avez aucun contrôle sur l'ordre dans lequel les lignes sont retournées. La raison réside dans la façon dont le langage SQL est spécifié.

2

Parce qu'il n'y a pas d'ordre inhérent dans les résultats. Si l'ordre est important, spécifiez la commande souhaitée à l'aide de la clause ORDER BY. Si ce n'est pas le cas, ne le faites pas.

2

À moins que vous n'indiquiez spécifiquement la commande, le serveur renverra les données de la façon dont il les récupérera le plus rapidement. Cela a légèrement changé lors de la mise à niveau de SQL 2000 vers SQL 2005, je crois.

Il y a un article de insteresting ici sur les tenants et les aboutissants détaillés: http://blogs.msdn.com/b/queryoptteam/archive/2006/05/02/588731.aspx