J'ai la requête ci-dessous que j'utilise pour renvoyer le résultat séparé par des virgules.
SELECT STUFF ( ( SELECT ',' + em.EMAIL FROM( SELECT DISTINCT USR.EMAIL AS EMAIL FROM PRNCPLS A, PRNCPLS B, USER_INFO USR, RELATIONSHIPS C WHERE A.ID = C.PARENTID AND B.ID = C.CHILDID AND A.TYPE = 'USER' and B.TYPE = 'ROLE' AND A.ID = USR.ID and B.NAME = 'Approver' AND USR.EMAIL IS NOT NULL) em ORDER BY em.EMAIL FOR XML PATH('') ), 1, 1, '' ) AS Output
Je dois mettre à jour cette requête de manière à ce que la première ligne de l'instruction SQL (et pas la sortie) commencez toujours comme ceci
SELECT EMAIL FROM
Ceci est nécessaire car l'outil que j'utilise pour une raison quelconque attend FROM dans la première ligne et un seul élément dans la clause
SELECT
. Ma requête ne renvoie en fait qu'un seul élément, donc j'espérais le mettre à jour d'une manière ou d'une autre.
Résultat attendu - abcd @ gmail.com, 1234 @ yahoo.com, xyz @ gmail.com
Toute aide serait appréciée.
4 Réponses :
avez-vous essayé
SELECT 'SELECT EMAIL FROM ' + STUFF ( ( SELECT ',' + em.EMAIL FROM( SELECT DISTINCT USR.EMAIL AS EMAIL FROM PRNCPLS A, PRNCPLS B, USER_INFO USR, RELATIONSHIPS C WHERE A.ID = C.PARENTID AND B.ID = C.CHILDID AND A.TYPE = 'USER' and B.TYPE = 'ROLE' AND A.ID = USR.ID and B.NAME = 'Approver' AND USR.EMAIL IS NOT NULL) em ORDER BY em.EMAIL FOR XML PATH('') ), 1, 1, '' ) AS Output;
ou y a-t-il d'autres informations sur le formatage des données?
Je pense que l'OP ne recherche pas SELECT EMAIL FROM
, mais plutôt un certain format pour articuler la requête ...
@Cato Merci pour votre réponse, mais inclut également le texte SELECT EMAIL FROM dans la sortie malheureusement.
Sortie attendue - abcd @ gmail.com, 1234 @ yahoo.com, xyz @ gmail.com
Vous pouvez encapsuler presque n'importe quel SELECT
comme ceci:
SELECT t.SomeColumn FROM ( place your existing SELECT here ) t;
Cela ne fonctionnerait pas avec une requête CTE, mais les CTE peuvent être eux-mêmes transformés en sous-requêtes .
Astuce : essayez d'éviter les jointures à l'ancienne si possible. Il y a un bon lien fourni par Sami dans les commentaires ...
Salut Shnugo, merci pour la réponse. J'ai mis à jour ma requête pour utiliser les JOIN. J'ai modifié la requête comme vous l'avez mentionné, mais cela ne fonctionne pas. Y a-t-il autre chose que je pourrais essayer?
@Newbie que veut dire mais ça ne marche pas ? Veuillez fournir plus de détails
malheureusement, changer les jointures avec la méthode moderne ne modifiera pas réellement la sortie. De plus, il est possible qu'il n'y ait pas de gain de performance.
Avez-vous essayé de faire
SELECT 'SELECT EMAIL FROM ' UNION ... Your existing query
SELECT EMAIL FROM ( SELECT STUFF ( ( SELECT ',' + em.EMAIL FROM( SELECT DISTINCT USR.EMAIL AS EMAIL FROM PRNCPLS A, PRNCPLS B, USER_INFO USR, RELATIONSHIPS C WHERE A.ID = C.PARENTID AND B.ID = C.CHILDID AND A.TYPE = 'USER' and B.TYPE = 'ROLE' AND A.ID = USR.ID and B.NAME = 'Approver' AND USR.EMAIL IS NOT NULL) em ORDER BY em.EMAIL FOR XML PATH('') ), 1, 1, '') AS EMAIL ) AS Output Beware of both "...EMAIL...": "SELECT EMAIL ..." "...1,1,'') AS EMAIL...".
Merci beaucoup Grimm, c'est exactement ce dont j'avais besoin.
Salut @Newbie, je suis heureux que vous ayez trouvé une solution. Juste pour mentionner ceci: c'est exactement la même chose que ma réponse. C'est un SELECT
où la requête existante est encapsulée en sous-requête ...
Tout d'abord, gardez à l'esprit qu'il s'agit d'une manière obsolète d'écrire des jointures:, vous devez commencer à convertir en INNER JOIN way
Mauvaises habitudes à prendre: en utilisant des JOINs à l'ancienne
Donc, pour le moment, vous obtenez un seul champ contenant des valeurs séparées par des virgules, mais vous souhaitez ajouter «SELECT EMAIL FROM» devant lui, est-ce correct? Ou voulez-vous également diviser la liste séparée par des virgules d'une manière ou d'une autre?