web-dev-qa-db-fra.com

Préserver ORDER BY dans SELECT INTO

J'ai une requête tSQL qui prend des données d'une table et les copie dans une nouvelle table, mais seulement les lignes répondant à une certaine condition:

SELECT VibeFGEvents.* 
INTO VibeFGEventsAfterStudyStart 
FROM VibeFGEvents
LEFT OUTER JOIN VibeFGEventsStudyStart
ON 
    CHARINDEX(REPLACE(REPLACE(REPLACE(logName, 'MyVibe ', ''), ' new laptop', ''), ' old laptop', ''), excelFilename) > 0
    AND VibeFGEventsStudyStart.MIN_TitleInstID <= VibeFGEvents.TitleInstID
    AND VibeFGEventsStudyStart.MIN_WinInstId <= VibeFGEvents.WndInstID
WHERE VibeFGEventsStudyStart.excelFilename IS NOT NULL
ORDER BY VibeFGEvents.id

Le code utilisant la table repose sur sa commande et la copie ci-dessus ne conserve pas la commande à laquelle je m'attendais. C'est à dire. les lignes de la nouvelle table VibeFGEventsAfterStudyStart n'augmentent pas de manière monotone dans la colonne VibeFGEventsAfterStudyStart.id copiée à partir de VibeFGEvents.id.

Dans tSQL, comment puis-je conserver l'ordre des lignes de VibeFGEvents dans VibeFGEventsStudyStart?

14
dumbledad

Pourquoi?

Point is - les données d'une table ne sont pas ordonnées. Dans SQL Server, l'ordre de stockage intrinsèque d'une table est celui de l'index en cluster (s'il est défini).

L'ordre dans lequel les données sont insérées est fondamentalement "non pertinent". Il est oublié au moment où les données sont écrites dans la table.

En tant que tel, rien n'est gagné, même si vous obtenez ce genre de choses. Si vous avez besoin d'une commande pour traiter des données, vous devez mettre une commande order by sur la sélection qui l'obtient. Tout le reste est aléatoire - c’est-à-dire que l’ordre dans lequel vous donnez les données n’est pas déterminé et peut changer.

Il est donc insensé d’avoir un ordre spécifique sur l’insert lorsque vous essayez de le réaliser.

SQL 101: les ensembles n'ont pas d'ordre.

24
TomTom

Je sais que c'est un peu vieux, mais je devais faire quelque chose de similaire. Je voulais insérer le contenu d'une table dans une autre, mais dans un ordre aléatoire. J'ai trouvé que je pouvais le faire en utilisant select top n et order by newid(). Sans le «n supérieur», l'ordre n'a pas été préservé et la deuxième table avait des lignes dans le même ordre que la première. Cependant, avec 'top n', l'ordre (aléatoire dans mon cas) a été préservé. J'ai utilisé une valeur de 'n' supérieure au nombre de lignes. Donc, ma requête était dans les lignes de:

insert Table2 (T2Col1, T2Col2)
  select top 10000 T1Col1, T1Col2
  from Table1
  order by newid()
16
Michael

La raison pour laquelle on souhaite cela (un ordre spécifique) est parce que vous ne pouvez pas définir cet ordre dans une sous-requête. L'idée est donc que, si vous créez une variable de table, ALORS faites une requête à partir de cette variable de table, vous penseriez conserverait l'ordre (par exemple, pour concaténer les lignes qui doivent être dans l'ordre, par exemple pour XML ou json), mais vous ne pouvez pas . Alors, que faites-vous? La réponse consiste à forcer SQL à le commander en utilisant TOP dans votre sélection (il suffit de choisir un nombre suffisamment élevé pour couvrir toutes vos lignes). 

0
MC9000

Vous ne pouvez pas faire cela avec ORDER BY, mais si vous créez un index clusterisé sur VibeFGEvents.id après votre SELECT IN, le tableau sera trié sur disque par VibeFGEvents.id.

0
Cyndi Baker