Comment puis-je joindre les résultats de deux requêtes dans SQL Server?
C'est mon deuxième SQL question aujourd'hui - je suis un peu un newbie sur le DBA choses...
Je suis en train de réunir un complexe de requête sql pour fusionner les données dans environ 12 tables en 1 seule table. Bien qu'il existe de nombreuses relations dans la base de données, je sais ce que le nombre maximum de chaque être.
Donc, j'ai (avec un débordement de pile de l'aide!) aplatir le premier niveau de ma base de données, et d'avoir une paire de requêtes qui doivent être réunis:
(version abrégée)
SELECT
A.StudentId, C1.Topic AS SIoC1, C1.Level AS SIoCScore1
FROM Assessment A
LEFT JOIN Concern C1 ON A.Id = Assessment_Id and C1.TopicNumber = 1
WHERE A.Type = 'School'
SELECT
A.StudentId, C1.Topic AS PIoC1, C1.Level AS PIoCScore1
FROM Assessment A
LEFT JOIN Concern C1 ON A.Id = Assessment_Id and C1.TopicNumber = 1
WHERE A.Type = 'Parent'
Est-il possible de requêtes de noms comme les alias?
Ou sinon, comment puis-je adhérer à ces deux requêtes, la sortie est identique:
| A.Id | SIoC1 | SIoCScore1 | PIoC1 | PIoCScore1 |
** Mise à JOUR **
Le domaine de base est qu'une Évaluation est effectuée, sur laquelle à la fois l'école et les parents doivent en faire rapport. Aussi, la ligne identifie une évaluation qui a à la fois l'École et les Parents des valeurs sur elle.
Je suis à l'aide de SQL Server 2005.
Merci!
* MISE À JOUR *
Cette requête semble faire le job...
SELECT PreConcerns.StudentId, TIoC1, TIoCScore1, PIoC1, PIoCScore1
FROM
Assessment PreConcerns
LEFT OUTER JOIN
(
SELECT
P.StudentId, C1.Topic AS TIoC1, C1.Level AS TIoCScore1
FROM Assessment P
LEFT JOIN Concern C1 ON P.Id = C1.Assessment_Id and C1.TopicNumber = 1
WHERE P.Type = 'School'
) scons
ON scons.StudentId= PreConcerns.StudentId
LEFT OUTER JOIN
(
SELECT
P.StudentId, C1.Topic AS PIoC1, C1.Level AS PIoCScore1
FROM Assessment P
LEFT JOIN Concern C1 ON P.Id = C1.Assessment_Id and C1.TopicNumber = 1
WHERE P.Type = 'Parent'
) pcons
ON pcons.StudentId = PreConcerns.StudentId
Nouvelle mise à JOUR (prendre 2!) **
(Je ne suis pas sûr si je devrais rouvrir une nouvelle question??!)
J'ai repris le travail aujourd'hui, de trouver mon au-dessus de "solution" n'a pas vraiment résoudre le problème, il crée deux lignes pour chaque évaluation.
Donc, pour résumer, j'ai les tableaux suivants:
Student (int:id, varchar(50):name)
Assessment (int:id, date:date, int:StudentId, )
Concern (int:id, int:assessment_id, varchar(20):topic, int:level)
Donc, pour chaque élève dans le système il y a exactement deux Évaluations: l'une de type "École", et une de type 'Parent'.
Je veux créer une ligne unique qui combine les évaluations et les préoccupations:
(pseudo colonnes:)
| Assessment.StudentId | SchoolConcernTopic | SchoolConcernLevel | ParentConcernTopic | ParentConcernLevel |
ou à partir de sql ci-dessus:
| PreConcerns.StudentId | SIoC1 | SIoCScore1 | PIoC1 | PIoCScore1 |
Avec une seule ligne peuplée par des étudiants, qui combine les deux évaluations.
J'ai la structure de ce travail avec le SQL ci-dessus, mais il retourne deux lignes! Et je ne peux pas travailler sur la façon de mettre à jour ce seulement le retour d'une toute aide reçue avec gratitude!!
Merci, comme toujours!
Vous devez vous connecter pour publier un commentaire.
Cela peut être fait avec une seule requête. La clause est juste une façon élégante de dire
A.Type = 'School' OR A.Type = 'Parent'
Assurez-vous que les noms de champ que vous désirez sont indiquées sur la première requête, puis
UNION ALL
les deux requêtes; si vous voulez un ensemble de résultats étiquetés la fin de l'autre.Ignorer ma première réponse, je vais prendre les déchets que ça ne pourra pas obtenir le résultat que vous souhaitez. Désolé.
Si vous voulez que la sortie ont répété des colonnes, où
SIoC1
etPIoC1
sont essentiellement les mêmes, mais avec un nom différent en fonction de si la ligne est à partir d'une "École" ou "Mère", alors votre résultats va jusqu'à la fin avec toutes les valeurs NULL par exemple (au hasard les données utilisées pour vous de ne pas fournir des données de l'échantillon)Si les données sont stockées dans le même tableau, avec les mêmes noms de champs d'utiliser un autre champ de distinguer les lignes, comme
Type
, et de les afficher dans les résultats.Une requête peut être suffisant:
Je pense que cette requête doit retourner le même résultat que celui de votre " Nouvelle mise à Jour de la section.
La
P.Type = ...
conditions ont été déplacés à partir d'OÙ selon les sections, de sorte que vous pouvez obtenir l'effet désiré sans avoir à recourir à rejoindre les sous-sélections.EDIT: il Semble que le regroupement devrait y aider. (Je pars de ma requête initiale de sorte qu'il est plus facile de voir le changement nécessaire pour la mise à jour de l'exigence.)
Vous pouvez sélectionner tout dans une seule requête et de l'utilisation de la
CAS
déclaration à seulement remplir les valeurs le cas échéantEdit: de Préférence vous serait de stocker le Type de colonne, de sorte que vous pourrait distinguer entre les deux types de données que vous voulais et puis vous n'aurez pas à répéter les colonnes comme dans l'exemple ci-dessus. Si vous créez une table, puis pour qu'il se conformer à une certaine forme de normalisation vous ne voulez pas avoir répété colonnes, cependant, si vous utilisez cette instruction select dans une VUE alors qu'il serait acceptable de le faire.
Le résultat des noms de colonnes doivent être les mêmes (l'alias utilisé) et les mêmes types de données:
D'essayer cette solution