如何在两个表之间连接多个列

时间:2015-03-09 15:56:01

标签: sql join union

我目前在学习SQL时遇到问题,当两个表中的两个或多个列相同时,我无法将表连接到另一个表。

例如,我有2个表:

(我不确定如何发布代码,所以我发布了一个链接,我希望这没关系)

这是表1,它显示了每个项目的每个阶段需要多长时间 http://puu.sh/gt92M/3dfe0063f0.png

这是表2,它显示了每个项目的阶段已经处理了多长时间

http://puu.sh/gt9HO/2fd5090c9a.png

到目前为止,我已经能够将它们放入同一个表中,但我无法将时间用于自己的列,目前它们与所需的小时数列混合。

SELECT ID, Stage, SUM(Hours_Taken)
FROM Work
GROUP BY ID, Stage
UNION
SELECT ID, Stage, Hours
FROM Budget_Allocation
GROUP BY ID, Stage

如您所见,每个项目都有阶段,每个阶段需要不同的工作时间。我希望能够显示4个圆柱表:

ID    
Stage   
Hours    
Hours_Taken.

2 个答案:

答案 0 :(得分:1)

您要求的结果的列包括从一个表派生的一些列和从另一个表派生的其他列。这意味着您需要执行某种JOINUNION运算符连接表,它只是将多个行集合整理为单个行集,从而消除重复。

但是,您要从中选择的行集之一不是基表,而是聚合查询的结果。这需要一个子查询,其结果根据需要加入到另一个基表:

SELECT
  tw.ID AS ID,
  tw.Stage AS Stage,
  ba.Hours AS Hours,
  tw.Hours_Taken AS Hours_Taken
FROM
  Budget_Allocation ba
  -- JOIN operator --
  JOIN (
    -- here's the subquery --
    SELECT ID, Stage, SUM(Hours_Taken) AS Hours_Taken
    FROM Work
    GROUP BY ID, Stage
  ) tw
    -- predicate for the preceding JOIN operator --
    ON ba.ID = tw.ID AND ba.Stage = tw.Stage

请注意,在这种情况下,您不希望先连接基表,然后聚合联合结果的行,因为您要从一列(Budget_Allocation.Hours)中选择既不是分组列也不是函数的值这些团体。该限制有解决方法和特定于实现的例外情况,但在这种情况下,在加入之前通过聚合直接做正确的事情很容易。

答案 1 :(得分:0)

你正在联合而不是加入。

选择w.id,w.stage,w.hours_taken,b.hours 来自工作w,budge_allocation b 其中w.id = b.id和 w.stage = b.stage;

现在,您可以在一行中拥有所需的一切,并且可以随心所欲地完成任务。