sql - 如何查询一个数据库,如果没有返回结果再查询另一个数据库?

标签 sql sql-server database

我有 4 个具有相同表(即相同结构)的数据库。 目的是检查数据库 1 中的 ID 号,如果存在则停止处理并返回名称。如果 ID 在数据库 1 中不存在,则检查数据库 2,依此类推。

我可以使用 UNION 组合结果,但我的目标是通过在第一个查询中找到结果时最小化对后续数据库的调用来优化此过程。

SELECT DOCNAME FROM DATABASE1.DOCTABLE WHERE DOCID=1
UNION
SELECT DOCNAME FROM DATABASE2.DOCTABLE WHERE DOCID=1
UNION
SELECT DOCNAME FROM DATABASE3.DOCTABLE WHERE DOCID=1
UNION
SELECT DOCNAME FROM DATABASE4.DOCTABLE WHERE DOCID=1

或者我正在考虑使用四个独立的存储过程并尝试这样的事情......

EXEC DB1_SP @DOCID=1, @DOCNAME1 OUTPUT

IF ISNULL(@DOCNAME)
    EXEC DB2_SP @DOCID=1, @DOCNAME2 OUTPUT
ELSE 
    RETURN @DOCNAME1
    EXIT
END IF
IF ISNULL(@DOCNAME2)
    EXEC DB3_SP @DOCID=1, @DOCNAME3 OUTPUT
ELSE 
    RETURN @DOCNAME2
    EXIT
END IF
etc...

有人有建议或替代方案吗?

最佳答案

如果所有四个数据库都在同一台服务器上(就像您的命名约定所建议的那样,既缺少服务器又缺少模式),我建议只执行 union all:

SELECT TOP 1 DOCNAME
FROM (SELECT DOCNAME FROM DATABASE1.DOCTABLE WHERE DOCID=1
      UNION ALL
      SELECT DOCNAME FROM DATABASE2.DOCTABLE WHERE DOCID=1
      UNION ALL
      SELECT DOCNAME FROM DATABASE3.DOCTABLE WHERE DOCID=1
      UNION ALL
      SELECT DOCNAME FROM DATABASE4.DOCTABLE WHERE DOCID=1
     ) t;

确保你在所有四个数据库中都有 doctable(docid) 或更好的 doctable(docid, docname) 索引,并且性能对于大多数用途来说应该没问题.

编辑:

如果这不符合性能目标,存储过程可以看起来像:

declare @docname . . . ;

SELECT @docname = DOCNAME FROM DATABASE1.DOCTABLE WHERE DOCID=1;

if @docname is null
begin
    SELECT @docname = DOCNAME FROM DATABASE2.DOCTABLE WHERE DOCID=1;
end;

if @docname is null
begin
    SELECT @docname = DOCNAME FROM DATABASE3.DOCTABLE WHERE DOCID=1;
end;

if @docname is null
begin
    SELECT @docname = DOCNAME FROM DATABASE4.DOCTABLE WHERE DOCID=1;
end;

存储过程中不需要 exec 来运行这些查询。

关于sql - 如何查询一个数据库,如果没有返回结果再查询另一个数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28984406/

相关文章:

php - 如何在 laravel 中使用嵌套关系列字段对查询结果进行排序?

php - 获取用户的所有帖子及其类别

sql-server - SQL Server 中嵌套事务的隔离范围是什么?

sql - 使用 UNION 子查询进行查询需要很长时间

sql-server - 将纪元时间转换为 SQL Server 日期时间并获取当前日期的数据 - 3

c# - 将 "\n"转换为 SQL Server 中的实际换行符

php - 用于删除用户记录的删除按钮 PHP

sql - 目前,我的所有 SQL 请求均显示 "System.ComponentModel.Win32Exception: The wait operation timed out"

php - SQL查询中的for循环

mysql - 有 2 个外键的表来自一个主表