SQL连接多个表

use*_*391 4 sql sql-server sql-server-2000

使用Microsoft SQL 2000,我想将多个表(A,B,C和D)连接在一起.我知道桌子A总是存在的.但是,我只知道至少有一种表格形式(B,C,D)存在.

我有什么方法可以做这样的事情来完成我想做的事情?

Select * form table a     
If table b exists left Join table b on a.id = b.id    
If table c exists left Join table c on a.id = c.id    
If table d exists left Join table d on a.id = d.id
Run Code Online (Sandbox Code Playgroud)

Jam*_*man 5

您必须检查数据字典视图并使用动态SQL

declare @myquery varchar(1000)

set @myquery = 'Select * from a '
if exists (select * from sysobjects where xtype='U' and name = 'b')
begin
   set @myquery = @myquery + 'inner join b on b.id = a.id '
end
if exists (select * from sysobjects where xtype='U' and name = 'c')
begin
   set @myquery = @myquery + 'inner join c on c.id = a.id '
end
if exists (select * from sysobjects where xtype='U' and name = 'd')
begin
   set @myquery = @myquery + 'inner join d on d.id = a.id '
end

exec( @myquery)
Run Code Online (Sandbox Code Playgroud)

我使用过sysobjects,然而您被鼓励使用信息架构视图,而不是

并且,动态SQL上的一个大型解析器

好处

  • 它提供了灵活性和可扩展性
  • 它可以减少写入的代码行数

缺点

  • 它可能变得非常复杂和难以阅读.考虑引号中嵌入的引号和其他类似的东西.
  • 它可能对代码稳定性产生不利影响.直到运行时才会知道某些动态SQL错误.(例如,您引用了一个不存在的表)
  • 动态SQL代码比等效的静态SQL更难测试.也可能无法测试动态SQL将遇到的每种可能情况,从而引入固有风险.
  • 在代码库中对动态SQL进行有效的影响分析将更加困难.
  • SQL注入和滥用 - 动态SQL更容易被滥用,并且总是不如静态SQL安全
  • 动态SQL中的查询代码不受查询计划的约束,因此可能会错过此类优化.因此,它可能比等效的静态SQL慢
  • 由于SQL查询直到运行时才知道,因此可能难以对SQL动态代码进行性能调优(例如,确定表上可能需要的索引)

  • +1 - 我只会添加此链接:www.sommarskog.se/dynamic_sql.html (2认同)