我有 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/