Combiner plusieurs résultats dans une sous-requête dans un seul valeurs séparées par des virgules
J'ai deux tables:
TableA
------
ID,
Name
TableB
------
ID,
SomeColumn,
TableA_ID (FK for TableA)
La relation est une ligne de TableA
- beaucoup de TableB
.
Maintenant, je veux voir un résultat de ce genre:
ID Name SomeColumn
1. ABC X, Y, Z (these are three different rows)
2. MNO R, S
Cela ne fonctionne pas (plusieurs résultats dans une sous-requête):
SELECT ID,
Name,
(SELECT SomeColumn FROM TableB WHERE F_ID=TableA.ID)
FROM TableA
C'est d'un banal problème si je fais le traitement côté client. Mais cela signifie que je vais avoir à exécuter X requêtes sur chaque page, où X est le nombre de résultats de TableA
.
Remarque que je ne peux pas tout simplement faire un GROUP BY ou quelque chose de semblable, car il renvoie plusieurs résultats pour lignes de TableA
.
Je ne suis pas sûr si un UDF, en utilisant FUSIONNENT ou quelque chose de semblable pourrait fonctionner?
Vous devez vous connecter pour publier un commentaire.
Même cela servira le but
Des données de l'échantillon
Requête:
De sortie:
FOR XML PATH('')
faire? Je n'ai jamais vu ça avant1. Créer de l'UDF:
2. L'utilisation de sous-requête:
3. Si vous utilisez une procédure stockée, vous pouvez faire comme ceci:
Je pense que vous êtes sur la bonne voie avec FUSIONNENT. Voir ici pour un exemple de création d'une chaîne délimitée par des virgules:
http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string
Dans MySQL il y a un group_concat fonction qui sera de retour ce que vous demandez.
Vous pouvez avoir besoin de fournir plus de détails pour plus de précision de la réponse.
Depuis votre dataset semble faible, vous pourriez envisager de simplement en utilisant une ligne par résultat et d'effectuer le post-traitement chez le client.
Donc, si vous êtes vraiment à la recherche pour que le serveur faire le travail de retour d'un jeu de résultats comme
qui est bien sûr une simple JOINTURE INTERNE sur l'ID
Une fois que vous avez le jeu de résultats au client, de maintenir une variable appelée CurrentName et de l'utiliser comme un déclencheur quand arrêter la collecte de SomeColumn dans la chose utile que vous souhaitez faire.
En supposant que vous avez seulement OÙ l'une des clauses sur la table A créer une procédure stockée ainsi:
Puis de remplir un DataSet ds avec elle. Puis
Enfin, vous pouvez ajouter un répéteur dans la page qui met les virgules pour chaque ligne
Cela vous permettra de le faire côté client mais avec une seule requête, en passant un minimum de données entre la base de données et interface
J'ai essayé la solution de priyanka.sarkar mentionné et n'a pas tout à fait le faire travailler comme l'OP demandé. Voici la solution que j'ai terminé avec:
Solution ci-dessous:
Utiliser cette fonction, vous pouvez également changer le Joint
Cela fonctionne pour la sélection de différentes table à l'aide de sous-requêtes.
J'ai passé en revue toutes les réponses. Je pense que dans la base de données d'insertion devrait être comme:
La virgule doit être à la précédente fin et faire de la recherche comme
%,X,%