我有两张桌子,我们叫它们TableA和TableB。
TableA TableB
------ ------
ID ID
Date Date
Foo Bar
这两个表的日期字段都有一个索引。现在,我想要创建一个视图,它在date字段的两个表之间有一个完整的外部连接,以便向我显示该日期的Foo
值(如果有)以及该日期的Bar
值。
create view vFooBar as
select isnull(a.Date, b.Date) Date, a.Foo, b.Bar
from TableA a
full outer join TableB b on a.Date = b.Date
然后我运行一个查询:
select * from vFooBar where Date = '20141201'
这很管用..。但是a.Date
和b.Date
的合并使编译器无法使用索引,我得到了一个涉及表扫描的可怕的执行计划。
如何以这样的方式创建此视图,以便查询它仍将使用我的索引?
发布于 2014-12-01 05:37:55
尝尝这个
select a.Date, a.Foo, b.Bar
from TableA a LEFT JOIN TableB b ON a.Date = b.Date
UNION
select b.Date, a.Foo, b.Bar
from TableB b LEFT JOIN TableA a ON a.Date = b.Date
严格地说,对于重复项,上面的查询不完全具有与原始完全连接相同的语义。完全连接的正确转换是向左加入联盟,所有的反半连接:
SELECT
TA.TheDate,
TA.Foo,
TB.Bar
FROM dbo.TableA AS TA
LEFT JOIN dbo.TableB AS TB
ON TB.TheDate = TA.TheDate
UNION ALL
SELECT
TB.TheDate,
Foo = NULL,
TB.Bar
FROM dbo.TableB AS TB
WHERE NOT EXISTS
(
SELECT NULL
FROM dbo.TableA AS TA
WHERE TA.TheDate = TB.TheDate
);
第二次重写还将方便在TheDate
列上使用索引。
https://dba.stackexchange.com/questions/83997
复制相似问题