2012-03-16 4 views
0

Je suis en train de trouver une chaîne de requête SQL pour lire des informations à partir de trois tables, où ils ont des noms de colonnes qui se chevauchent:Nested Inner Join avec des colonnes portant le même nom?

Table: Task 
Id 
TaskDescription 
... 

Table: TaskAttempt 
Id 
TaskId 
User 
... 

Table: TaskSubmission 
Id 
TaskAttemptId 
Data 
... 

Une tâche contient une description. Les utilisateurs peuvent tenter d'accomplir la tâche et ils soumettent leurs résultats. Chaque tentative de tâche peut avoir plusieurs soumissions. Lors de l'examen, je souhaite intégrer toutes les soumissions de tâches et afficher la description, l'utilisateur et les données; J'ai également besoin de rentrer tous les champs d'identification afin que je puisse mettre à jour les lignes après l'achèvement de l'examen. À quoi ressemblerait une instruction SQL pour capturer cela?

Répondre

1

Pour gérer les noms de colonne qui sont identiques dans des tables différentes, vous devez préfixer les colonnes avec la table à partir de laquelle vous demandez les données. C'est un shell TRÈS basique de ce à quoi ressemblerait votre requête. Les instructions JOIN ont besoin des colonnes correspondantes, mais vous n'avez pas fourni le schéma sur la façon dont elles correspondent. Cependant, cela répond à votre question de base sur les colonnes portant le même nom.

SELECT Task.Id, Task.TaskDescription, TaskAttempt.Id, TaskAttempt.User, 
    TaskSubmission.Id, TaskSubmission.Data 
FROM Task 
    JOIN TaskAttempt 
     ON Task.Id = TaskAttempt.TaskId 
    JOIN TaskSubmission 
     ON TaskAttempt.Id = TaskSubmission.TaskAttempId 

Prefixes donnent simplement assez de données supplémentaires le moteur SQL pour savoir comment gérer les ambiguïtés, et ils peuvent aussi fournir le code beaucoup plus expressif pour les futurs lecteurs.

+0

J'ai ajouté les champs de clé étrangère. Est-ce que cela fonctionne si je le fais JOIN Taskttempt ON Task.Id = TaskAttempt.TaskId JOIN TaskSubmission ON TaskAttempt.Id = TaskSubmission.TaskAttemptId? –

+0

Oui, en fait, j'ai mis à jour mon code aussi. –

0

Vous pouvez spécifier la table à tirer de l'utilisation table_name.field, donc:

SELECT Task.Id, TaskAttempt.Id, TaskSubmission.Id 
FROM Task, TaskAttempt, TaskSubmission 

Vous obtenez le point. C'est une bonne idée d'utiliser le nom de la table dans tous les champs lorsque vous traitez plusieurs tables. Exemple:

SELECT Task.Id, Task.TaskDescripton, TaskAttempt.Id... 
FROM ... 

Même si TaskDescription n'existe pas dans les autres tableaux, j'utilise toujours le nom de la table pour plus de clarté.