IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

[SQL2005] [TSQL] Problème d'utilisation de UNION


Sujet :

Développement SQL Server

  1. #1
    Invité
    Invité(e)
    Par défaut [SQL2005] [TSQL] Problème d'utilisation de UNION
    Bonjour,

    J'ai un message d'erreur lors d'une requête utilisant UNION et je ne comprends pas pourquoi. Voici ma requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT * FROM dbo.full_user_requests
    	WHERE	dbo.full_user_requests.request_last_date IS NOT NULL
    	AND	dbo.full_user_requests.request_last_date >= DATEADD(d, -7, GETDATE())
    	ORDER BY dbo.full_user_requests.request_last_date ASC
     
    UNION
     
    SELECT * FROM dbo.full_user_requests
    	WHERE	dbo.full_user_requests.request_last_date IS NULL
    	AND	dbo.full_user_requests.request_date >= DATEADD(d, -7, GETDATE())
    	ORDER BY dbo.full_user_requests.request_date ASC
    J'obtiens le message d'erreur suivant dans SQL Management Studio : "Incorrect syntax near the keyword 'UNION'." Ce n'est pas très précis, mes deux parties de requête s'exécutent très bien indépendamment donc a priori l'erreur ne se situe pas là, ce doit être une particularité avec UNION que je ne connais pas...

    Par curiosité, j'ai essayé sans les clauses ORDER BY, et j'ai alors le message d'erreur suivant : "The text data type cannot be selected as DISTINCT because it is not comparable." Mais il ne m'avance pas plus : je ne comprends pas ce qu'il veut dire...

    Je suis un peu bloquée du coup là... Est-ce que quelqu'un pourrait m'aider ? Merci d'avance

  2. #2
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Bonjour,

    L'erreur:
    "Incorrect syntax near the keyword 'UNION'."
    Est bien en relation avec la clause order by.

    L'erreur:
    "The text data type cannot be selected as DISTINCT because it is not comparable."
    Est liee au fait qu'au moins un de vos champs dans la table dbo.full_user_requests est un champs texte.

    Pourquoi ne pas ecrire la requete comme ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT * FROM dbo.full_user_requests
    	WHERE	(dbo.full_user_requests.request_last_date IS NOT NULL
    	AND	dbo.full_user_requests.request_last_date >= DATEADD(d, -7, GETDATE()))
    OR
    (dbo.full_user_requests.request_last_date IS NULL
    	AND	dbo.full_user_requests.request_date >= DATEADD(d, -7, GETDATE()))
    	ORDER BY dbo.full_user_requests.request_last_date ASC

  3. #3
    Invité
    Invité(e)
    Par défaut
    Merci pour la réponse !

    J'ai pensé à l'utilisation du OR, mais le champ sur lequel je trie dans les deux cas n'est pas le même...

    Donc pas d'UNION si on a des champs text ?

  4. #4
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Comment voulez vous trier ?
    Car de toute facon, l'UNION ne comprendra pas vos choix de tri specifies comme cela...

  5. #5
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    Il est possible de garder l'opérateur UNION ... d'autant plus qu'en utilisant un OR vous ne pourrez pas profiter d'éventuels index qui existeraient sur votre table dbo.full_user_requests.

    Evitez de mettre un SELECT * dans votre requête .. je suppose que vous ne voulez pas récupérer toutes les colonnes dans votre résultat.

    Un ORDER BY avec une expression CASE ne pourrait elle pas fonctionner dans votre cas ?

    ++

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par mikedavem Voir le message
    Evitez de mettre un SELECT * dans votre requête .. je suppose que vous ne voulez pas récupérer toutes les colonnes dans votre résultat.
    Effectivement, j'ai un nombre assez important de colonne, de plus c'est une vue, et je devrais donc mettre la procédure stockée à jour si j'ajoute ou retire des champs de la vue...

    Citation Envoyé par mikedavem Voir le message
    Un ORDER BY avec une expression CASE ne pourrait elle pas fonctionner dans votre cas ?
    Je ne savais pas que le CASE pouvait être utilisé dans la clause ORDER BY ! Je vais essayer, merci

    EDIT: J'ai peut être mal compris ce que fait UNION, je pensais qu'il accolait simplement les deux jeux de résultats (d'où mon idée de les trier chacun selon un critère spécifique), mais au vu de vos remarques, on dirait que c'est bien plus compliqué que ça !

  7. #7
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Dans une requête SQL vous ne pouvez avoir qu'une seule clause ORDER BY. En effet la clause ORDER BY n'est pas relationnelle, mais cosmétique. Elle n'agit que pour présenter les données, pas pour les traiter.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  8. #8
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    L'union de 1 et 1 vaut 1 et non pas 1, 1. En effet il n'y a pas de doublons. Il faut donc un traitement de dédoublonnage (qui se traduit souvent pas un tri), sauf si vous utilisez UNION ALL qui restitue les doublons.

    A lire : http://sqlpro.developpez.com/cours/sqlaz/ensembles/#L3

    a +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  9. #9
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup pour le lien ! Très bien expliqué et beaucoup d'exemples très parlants. J'avais déjà lu certains chapitres de ce cours il y a un moment, je n'ai pas pensé qu'il y en aurait un aussi important sur l'UNION

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Vous n'avez pas écrit votre solution qui fonctionne.
    J'aurai écrit ceci de mon côté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      SELECT *
        FROM dbo.full_user_requests
       WHERE coalesce(request_last_date, request_date) >= DATEADD(d, -7, GETDATE())
    ORDER BY coalesce(request_last_date, request_date) asc
    Si problème de performance, regardez du côté des index de fonction (ou index sur une colonne calculée, je ne sais plus en T-SQL).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [SQL2005] [TSQL]Problème d'une CTE dans une vue
    Par mgonc dans le forum MS SQL Server
    Réponses: 15
    Dernier message: 19/10/2009, 11h21
  2. [SQL2005][TSQL] Problème charset/collate
    Par luunaz dans le forum Développement
    Réponses: 12
    Dernier message: 28/07/2009, 21h10
  3. [SQL2005][TSQL]Problème de jointures multiples
    Par Veritas5 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/03/2009, 17h04
  4. [SQL2005] [TSQL] Problème d'auto-jointure et *
    Par Invité dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/12/2007, 16h14
  5. [SQL2005][TSQL] Problème de curseur / Fonction ne "compile" pas
    Par Ivenoproblemwiththat dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 01/06/2007, 21h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo