SQL:内部联接(如果存在)

时间:2018-07-25 09:39:53

标签: sql sql-server sql-server-2012

select a_table.fname,a_table.lname,a_view.tell 
from a_table 
if exists(select 1 from sys.views where name='a_view' and type='v')
{
    inner join a_view on a_table.id=a_view.id
}

我的问题:

如果我之前创建了视图,则将内部与视图一起加入我的表 如果a_view存在,则显示a_view.tell,因为a_view在a_view中! 如果我不存在a_view时选择a_view.tell,则不正确

2 个答案:

答案 0 :(得分:1)

为此可以使用动态sql。

DECLARE @DynSql VARCHAR(max);

SET @DynSql = 'select fname, lname from a_table';

IF OBJECT_ID('a_view', 'v') IS NOT NULL 
BEGIN
   SET @DynSql = 'select 
  t.fname, t.lname, v.tell
from a_table t
join a_view v on v.id = t.id';
END

EXEC (@DynSql);

答案 1 :(得分:1)

这个评论太长了。

创建视图!不要以表或视图是否存在为条件来查询。

数据库应该具有结构,几乎没有理由没有所需的表和视图。

因此,在到达需要此查询的位置之前,请确保该视图存在。我不确定这在您的环境中需要什么,但可能包括:

  • 使用正确的权限创建视图,以免被意外删除。
  • 安排一个作业以检查该视图是否存在和/或定期更新该视图。
  • 在脚本的较早位置创建视图。