加入不存在的 table

Join on table that does not exist

当一个或多个表甚至不存在时,是否可以连接表?

考虑这个用例:您使用的系统具有开箱即用的特定数据库方案,但也允许您创建自己的自定义表。

可以 运行 包含自定义表的某种查询,但对于没有设置这些自定义表的人来说 运行 也不会出错?

或者无需维护不同版本的查询即可实现此目的的最优雅方法是什么?

编辑:尤其是 Sybase ASE,但我也对其他 dbms 感兴趣。

你可以这样做:

IF EXISTS (Select * from sysobjects where name = 'tblname')
Begin

Select *
from tbl

End
Else
Begin
--Do something else
End

基本上检查 table 是否存在并且 运行 查询是否存在,如果不存在则执行其他操作。

SQL 服务器

尝试使用 TRY/CATCH,它可以包含任何高达错误严重性 20 的内容。

在您的情况下,您正在尝试捕获错误严重性 11 - "Indicates that the given object or entity does not exist." - 这在 TRY/CATCH 块中应该没问题。

此处有更多信息和示例:https://msdn.microsoft.com/en-us/library/ms175976.aspx

在我的例子中,我专门用它来删除 tables - 再也懒得做一个 IF 语句来检查 table 是否存在。

开始尝试放下 TABLE XXX 结束尝试开始捕捉结束捕捉

在大多数 RDBMS 中,查询执行看起来像这样:

  • 解析器
    • 名称解析(这会检查引用的对象、绑定别名等)
    • 类型派生(确定结果集中的最终类型)
    • 聚合 bindinf(确定是否需要任何聚合)
    • 组绑定(将聚合绑定到 select 列表)
  • 代数师
  • 优化器
  • 执行

由于查询执行的步骤,RDBMS 总是检查引用的对象(在名称解析步骤中),然后执行实际的查询处理(执行任何用户定义的检查 - 例如 IF 语句)。 (这代表数据操作,而不是数据定义)。

简而言之:在大多数 RDBMS 中,您不能这样做,只能使用动态查询。

在我看来,动态查询有时很有用,但维护和调试它们并不是一件容易的事,所以要小心,尤其是当查询生成基于复杂的逻辑时。

请记住,大多数客户端应用程序只接受预定义的结果集(这包括列及其类型),因此在客户端应用程序中使用动态查询也可能是一个问题。

对于 Sybase,您可以在其在线文档中阅读有关查询处理的更多信息:Performance and Tuning Series: Query Processing and Abstract Plans