创建索引视图时如何在 SQL Server 中将 LEFT JOIN 模拟为 INNER JOIN

问题描述 投票:0回答:1

在SQL Server中创建索引视图时可以使用内连接模拟左连接吗?我找到了使用

ISNULL(id,0)
的解决方案,但它对我不起作用。

我有

Table1 (ID PK, ID_U FK null)
并且我想离开加入
Table2 (ID_U PK, VALUE)
。我想查看
Table1
中的所有行以及
Table2
中的关联行(如果存在 ID_U)。

在创建的视图脚本中我有

select t1.ID, t1.ID_U, t2.VALUE 
from Table1 t1 
join Table2 t2 on t1.ID_U = t2.ID_U 
               or (ISNULL(t1.ID_U, 0) = 0 and ISNULL(t2.ID_U, 0) = 0)
where t1.ID_U is null -- only for test

/* create clustered index */

因此,我应该看到

Table1
中的所有行,其中 ID_U 为空,右表中为空,但我有 0 行。

我做错了什么?

sql sql-server t-sql view indexed-view
1个回答
0
投票

我不建议您这样做。

你真的不应该这样做。

甚至不确定 SQL 是否允许您创建索引视图来执行此操作 - 希望不会。

但是,如果您绝对必须做出像 LEFT JOIN 这样的 INNER 行为,那么这是一种方法...

select 
    t1.ID, 
    t1.ID_U, 
    iif(t1.ID_U IS NULL, NULL, t2.Value) as Value  -- return NULL when joined with the dummy record
from Table1 t1 
join Table2 t2 on t1.ID_U = t2.ID_U 
               or ISNULL(t1.ID_U, 1) = t2.ID_U  -- this joins the same row from t2 (with ID_U = 1) to every row in t1 that has a ID_U of NULL .  NOTE:  There must be a row in t2 with ID_U = 1
© www.soinside.com 2019 - 2024. All rights reserved.