2012-03-16 72 views
0

我想拿出一个SQL查询字符串从三个表,在那里他们有重叠的列名读取信息:嵌套的内部联接具有相同名称的列?

Table: Task 
Id 
TaskDescription 
... 

Table: TaskAttempt 
Id 
TaskId 
User 
... 

Table: TaskSubmission 
Id 
TaskAttemptId 
Data 
... 

任务包含的说明。用户可以尝试完成任务并提交结果。每个任务尝试可以有多个提交。

在审阅时,我想提交所有任务提交并显示说明,用户和数据;我还需要提取所有Id字段,以便在完成审阅后更新行。

什么是SQL语句看起来像捕捉这个?

回答

1

要处理在不同表中相同的列名,您必须在列的前面添加要请求数据的表。这是你的查询看起来像一个非常基本的shell。语句JOIN需要相应的列,但是您没有提供模式以了解它们的匹配方式。但是,这回答了您有关具有相同名称的列的基本问题。

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 

前缀只是给SQL引擎足够的额外数据,知道如何处理歧义,并且他们还可以向未来的读者提供更富于表现力的代码。

+0

我添加了外键字段。这是否工作,如果我让它加入TaskAttempt ON Task.Id = TaskAttempt.TaskId JOIN TaskSubmission ON TaskAttempt.Id = TaskSubmission.TaskAttemptId? – 2012-03-16 02:18:53

+0

是的,实际上,我也更新了我的代码。 – 2012-03-16 03:14:20

0

您可以指定使用table_name.field,所以拉的表:

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

你明白了吧。每当您处理多个表时,在所有字段上使用表名是个好主意。例如:

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

即使TaskDescription没有其他表中不存在,我仍然使用表名清晰度。