我目前在学习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.
答案 0 :(得分:1)
您要求的结果的列包括从一个表派生的一些列和从另一个表派生的其他列。这意味着您需要执行某种JOIN
。 UNION
运算符不连接表,它只是将多个行集合整理为单个行集,从而消除重复。
但是,您要从中选择的行集之一不是基表,而是聚合查询的结果。这需要一个子查询,其结果根据需要加入到另一个基表:
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;
现在,您可以在一行中拥有所需的一切,并且可以随心所欲地完成任务。