【发布时间】:2010-05-26 05:49:25
【问题描述】:
我正在尝试编写一个快速(哈哈!)的程序来组织我的一些财务信息。我理想中想要的是一个查询,它将从 TableA 返回所有包含财务信息的记录。每个月应该有一行,但在一个月没有交易的情况下,将没有记录。我得到这样的结果:
SELECT Period,Year,TotalValue FROM TableA WHERE Year='1997'
结果:
Period Year TotalValue
1 1997 298.16
2 1997 435.25
4 1997 338.37
8 1997 336.07
9 1997 578.97
11 1997 361.23
通过加入一个表(在这个例子中是一个视图),它只包含一个字段Period,值从 1 到 12,我希望得到这样的结果:
SELECT p.Period,a.Year,a.TotalValue
FROM Periods AS p
LEFT JOIN TableA AS a ON p.Period = a.Period
WHERE Year='1997'
结果:
Period Year TotalValue
1 1997 298.16
2 1997 435.25
3 NULL NULL
4 1997 338.37
5 NULL NULL
6 NULL NULL
7 NULL NULL
8 1997 336.07
9 1997 578.97
10 NULL NULL
11 1997 361.23
12 NULL NULL
无论我如何加入它,我实际上得到的是相同的结果(除了 CROSS JOIN 会发疯,但这真的不是我想要的,只是看看不同的加入是否在做任何事情) .即没有NULL记录,它只返回TableA中对应句点存在的记录,而不是不管从1到12的12条记录。 LEFT JOIN、RIGHT JOIN、INNER JOIN 都无法提供我期望的 NULL 记录。
我在 JOIN 中做错了什么明显的事情吗?我加入视图是否重要?
编辑 使用 Mark Byers 的示例,我尝试了以下操作:
SELECT p.Period,a.Year,a.TotalValue
FROM Periods AS p
LEFT JOIN TableA AS a ON (p.Period = a.Period) AND (a.Year = '1997')
结果:
Period Year TotalValue
1 1997 298.16
2 1997 435.25
4 1997 338.37
8 1997 336.07
9 1997 578.97
11 1997 361.23
它以不同的方式有效地获得了相同的结果,但仍然没有获得 3、5、6、7 等的预期 NULL 条目。
非常感谢 Mark Byers 帮助制定了最终解决方案,记录在案的是:
SELECT p.Period, a.YEAR, SUM(a.Value) as TotalValue
FROM
Periods as p
LEFT JOIN
TableA as a
ON d.Period = p.Period AND a.Year = '1997'
GROUP BY p.Period,a.Year,a.PERIOD
ORDER BY p.Period,a.Year;
实际上,还有一个 LedgerID 字段被分组,尽管最终结果保持不变:过滤需要在 JOIN 上进行,而不是在 JOIN 的结果上进行。
【问题讨论】:
-
正如 FULL OUTER JOIN 答案留下的评论所暗示的那样,显然没有。想一想 - WHERE 子句过滤掉 JOIN 的结果有效地使 JOIN 的结果无效,因为那些连接的记录将包含 NULL 值。选择标准需要应用于实际的 JOIN。
标签: sql sql-server join