【发布时间】:2015-12-24 10:51:29
【问题描述】:
我的问题是我们可以在不使用子查询、CTE 或临时表的情况下将表 A 连接到表 A 和 B 的内部连接的结果表吗?
我正在使用 SQL Server。
我会举例说明情况
有两个表GoaLScorers 和GoalScoredDetails。
进球得分手
gid Name
-----------
1 A
2 B
3 A
GoalScoredDetails
DetailId gid stadium goals Cards
---------------------------------------------
1 1 X 2 1
2 2 Y 5 2
3 3 Y 2 1
我期望的结果是如果我选择一个体育场“X”(或“Y”)
我应该得到所有可能或可能没有在那里得分的人的名字,以及总进球数,总牌数。
如果没有目标或没有卡片,名称可以接受 Null 值。
我可以通过以下查询得到我期望的结果
SELECT
gs.name,
SUM(goal) as TotalGoals,
SUM(cards) as TotalCards
FROM
(SELECT
gid, stadium, goal, cards
FROM
GoalScoredDetails
WHERE
stadium = 'Y') AS vtable
RIGHT OUTER JOIN
GoalScorers AS gs ON vtable.gid = gs.gid
GROUP BY
gs.name
我的问题是我们可以在不使用子查询或 CTE 或临时表的情况下获得上述结果吗?
基本上我们需要做的是OUTER JOIN GoalScorers 到INNER JOIN OF GoalScorers 和GoalScoredDetails 的结果虚拟表。
但我总是面临模棱两可的列名错误,因为 GoalScorers 和结果表中都存在“gid”列。即使我尝试对列名使用别名,错误仍然存在。
我为她创建了一个 sql fiddle:http://sqlfiddle.com/#!3/40162/8
【问题讨论】:
-
如果您在引用列时始终使用表名或别名,您将避免错误。示例:SELECT gid 不包含 SQL 所需的所有信息,而 SELECT gs.gid 包含。
-
@destination-data 主要问题是如何在结果表中设置别名或指定 gid 列。即使我在 select 中分配了别名,它也不能用于加入,除非它是子查询
标签: sql sql-server database