我一直在阅读文档并查看常见问题解答,但尚未找到此问题的答案,这可能意味着无法完成。我的实际情况稍微复杂一些,但我会尽量简化这个问题。对于过去的每一年,我都有一个标题/详细信息表,其中包含一个链接它们的外键。年份数据在标题记录中!我希望能够查询跨年连接的所有表。
我设置了遵循“SELECT + UNION ALL”格式的视图。我还在标题表上设置了检查约束,以将它们的值限制在各自的年份。这允许 SQL Server 查询优化器在运行受 WHERE 子句限制的查询时仅查询特定表。惊人的。到目前为止,通过搜索分区视图,可以随时随地找到此信息。
我想对详细信息表进行相同类型的查询优化,但无法弄清楚。明细记录中没有任何内容表明它属于哪一年,而不与表头记录连接;意思是,外键约束是我必须摆脱的唯一约束。
我想到的唯一解决方案是在明细表中添加一个“年份”列,然后在查询中添加另一个 where 子句。我可以做些什么来使用现有的外键约束创建详细表的分区视图?
以下是一些 DDL 供参考:
CREATE TABLE header2008 (
hid INT PRIMARY KEY,
dt DATE CHECK ('2008-01-01' <= dt AND dt < '2009-01-01')
)
CREATE TABLE header2009 (
hid INT PRIMARY KEY,
dt DATE CHECK ('2009-01-01' <= dt AND dt < '2010-01-01')
)
CREATE TABLE detail2008 (
did INT PRIMARY KEY,
hid INT FOREIGN KEY REFERENCES header2008(hid),
value INT
)
CREATE TABLE detail2009 (
did INT PRIMARY KEY,
hid INT FOREIGN KEY REFERENCES header2009(hid),
value INT
)
GO
CREATE VIEW headerAll AS
SELECT * FROM header2008 UNION ALL
SELECT * FROM header2009
GO
CREATE VIEW detailAll AS
SELECT * FROM detail2008 UNION ALL
SELECT * FROM detail2009
GO
--This only hits the header2008 table (GOOD)
SELECT *
FROM headerAll h
WHERE dt = '2008-04-04'
--This hits the header2008, detail2008, and detail 2009 tables. (BAD)
SELECT *
FROM headerAll h
INNER JOIN detailAll d ON h.hid = d.hid
WHERE dt = '2008-04-04'