我有4个具有相同表格的数据库(即相同的结构)。 目的是检查数据库1的ID号,如果它存在停止处理并返回一个名称。如果数据库1中不存在该ID,则检查数据库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...
有没有人有建议或替代方案?
答案 0 :(得分:0)
您使用的是sql-server。 然后你可以使用@@ ROWCOUNT。
参考:https://msdn.microsoft.com/en-us/library/ms187316.aspx
SELECT DOCNAME FROM DATABASE1.DOCTABLE WHERE DOCID=1
if @@Rowcount = 0
SELECT DOCNAME FROM DATABASE2.DOCTABLE WHERE DOCID=1
if @@Rowcount = 0
SELECT DOCNAME FROM DATABASE3.DOCTABLE WHERE DOCID=1
答案 1 :(得分:0)
如果所有四个数据库都在同一台服务器上(由您的命名约定建议缺少服务器而且还有架构),我建议您只做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
来运行这些查询。