1143 votes

SQL exclure une colonne en utilisant SELECT * [sauf colonneA] de tableA ?

Nous savons tous que pour sélectionner toutes les colonnes d'un tableau, nous pouvons utiliser

SELECT * FROM tableA

Existe-t-il un moyen d'exclure une ou plusieurs colonnes d'un tableau sans spécifier toutes les colonnes ?

SELECT * [except columnA] FROM tableA

Le seul moyen que je connaisse est de spécifier manuellement toutes les colonnes et d'exclure la colonne indésirable. Cela prend beaucoup de temps et je cherche donc des moyens d'économiser du temps et des efforts sur ce point, ainsi que sur la maintenance future si la table a plus ou moins de colonnes.

Merci !

58 votes

Il serait très pratique de disposer de cette fonctionnalité, non pas pour la mettre dans le code de production, mais à des fins de dépannage. Exemple : J'ai une table qui a plusieurs colonnes que j'interroge, mais je veux rapidement omettre une ou deux colonnes de texte.

0 votes

J'en avais besoin lorsque je travaillais avec openquery (bien que j'aie besoin de la fonctionnalité dans MySQL plutôt que dans SQL Server). Je devais interroger une base de données MySQL à l'aide de SQL Server. Parce qu'une table MySQL avait des colonnes de caractères de largeur fixe, je ne pouvais pas utiliser une fonction SELECT * (OLE DB a du mal à les mettre en correspondance). Je n'ai pas pu spécifier les bonnes colonnes car je n'avais pas d'accès direct à la base de données MySQL, mais SQL Server a eu la gentillesse de m'informer des noms des colonnes de caractères à largeur fixe...

9 votes

J'aimerais ajouter une autre raison de le faire : SELECT DISTINCT * sauf pour la colonne clé qui doit fonctionner sans dupliquer les lignes que quelqu'un d'autre a créées.

604voto

Norman Skinner Points 1437

Je suis d'accord avec tout le monde... mais si je devais faire quelque chose comme ça, je le ferais de cette façon :

/* Get the data into a temp table */
SELECT * INTO #TempTable
FROM YourTable
/* Drop the cloumns that are not needed */
ALTER TABLE #TempTable
DROP COLUMN ColumnToDrop
/* Get results and drop temp table */
SELECT * FROM #TempTable
DROP TABLE #TempTable

417 votes

Inefficace... mais très créatif :)

5 votes

Magnifique. J'ai souvent besoin d'inclure la jointure de deux tables temporaires ou d'une table temporaire vers une autre table lorsque je n'ai pas besoin de toutes les colonnes de la table temporaire - en particulier parce que le regroupement sera impliqué.

3 votes

Très bien. Cela résout le problème de l'abstraction des noms de colonnes.

322voto

gbn Points 197263

Non.

La meilleure pratique en matière de maintenance légère consiste à ne spécifier que les colonnes nécessaires.

Au moins deux raisons :

  • Cela rend votre contrat entre le client et la base de données stable. Les mêmes données, à chaque fois
  • Performance, indices de couverture

Edit (juillet 2011) :

Si vous faites glisser depuis l'Explorateur d'objets le Columns pour une table, il affiche une liste CSV des colonnes dans la fenêtre de requête, ce qui permet d'atteindre l'un de vos objectifs.

9 votes

Il existe des scénarios valables avec SELECT *, notamment dans les routines ETL. Je pense que la meilleure réponse ici est celle du SQL dynamique.

2 votes

Il y a des cas où vous voulez sélectionner, disons, toutes les données d'un étudiant pour une exploration statistique, mais sans faire descendre le fil de l'identifiant de l'étudiant lui-même pour renforcer la confidentialité.

2 votes

Je suis content d'avoir lu ce post pour découvrir l'astuce CSV. C'est pourquoi il est plus important de donner le contexte et les informations sur le sujet que de donner des réponses directes. +Je vous félicite pour cela.

104voto

hims056 Points 13538

Si vous ne voulez pas écrire chaque nom de colonne manuellement, vous pouvez utiliser Script Table As en cliquant avec le bouton droit de la souris sur tableau ou voir sur SSMS comme ça :

enter image description here

Vous obtiendrez alors l'ensemble de la requête de sélection dans Fenêtre de l'éditeur de nouvelles requêtes puis supprimez la colonne indésirable comme ceci :

enter image description here

Terminé

2 votes

C'est plus facile que en sélectionnant tous les noms de colonnes puis ajoutez-y des virgules.

87voto

pl80 Points 211

La façon automatisée de faire cela en SQL (MS SQL) est la suivante :

declare @cols varchar(max), @query varchar(max)
SELECT  @cols = STUFF
    (
        ( 
            SELECT DISTINCT '], [' + name
            FROM sys.columns
            where object_id = (
                select top 1 object_id from sys.objects
                where name = 'MyTable'
            )
            and name not in ('ColumnIDontWant1', 'ColumnIDontWant2')
            FOR XML PATH('')
        ), 1, 2, ''
    ) + ']'

select @query = 'select ' + @cols + ' from MyTable where'  
exec (@query)

1 votes

Que se passe-t-il si vous effectuez une requête à partir du résultat d'un CTE ou d'une autre sous-requête ? Un exemple simple : vous pourriez vouloir créer une sous-requête qui ajoute le résultat de row_number() à chaque ligne, puis effectuer une jointure par row_number puis tout sélectionner _à l'exclusion de la row_number_ du résultat de la jointure.

56voto

campo Points 441

Vous pouvez créer une vue qui contient les colonnes que vous souhaitez sélectionner, puis vous pouvez simplement sélectionner * dans la vue...

15 votes

Au début, ma réaction était la suivante : "En quoi est-ce plus facile que de spécifier simplement les colonnes" ? Mais ensuite, j'ai décidé que du point de vue de la maintenance, cela pouvait être une amélioration.

2 votes

Cela permet également de soutenir l'optimiseur de requêtes plutôt que de le contrecarrer avec une table temporaire ou du SQL dynamique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X