2010-12-02 85 views
2

我有两个表,一个当前表和一个存档表。SQL服务器从两个可能的表中选择一个

当一个记录搜索,我不知道它会在哪个表,所以我有一个查询类似以下内容:

SELECT myThing FROM (current UNION archive) 

我想知道,是有可能写上面的查询就像

SELECT myThing FROM current 

IF myThing IS NULL 
BEGIN 
    SELECT myThing FROM ARCHIVE 
END 

以及哪一个,哪一个或哪些,或者这些方法可能是更高性能的。

+1

会不会有永远只能是一行返回查询? – 2010-12-02 11:34:34

+0

@Martin,是0或1行 – fearofawhackplanet 2010-12-02 11:40:37

回答

2

你的第二个例子几乎可以正常工作。只需要一个变量

Declare @theThing varchar(max) 

SELECT @theThing = myThing FROM current 

IF (@theThing IS NULL) 
BEGIN 
    SELECT @theThing = myThing FROM ARCHIVE 
END 

-- to 'output' the value 
SELECT @theThing 

然后,您可以将该代码粘贴到存储过程或函数或其他东西。

注意确定它是否会比工会快。如果myThing在两个表中都被索引,我的预感会更快。但那只是一个猜测。

编辑:表现还会受到在第一个表格中发现物品的频率的影响。如果大部分时间在第一个表格中找到目标,上面的代码可能会比union更快。

编辑:正如马丁指出的那样,只有在两张表中只有一个匹配的情况下,这一切才是值得的。否则,你需要一个联盟。

1

使用UNION将是性能杀手,因为这将迫使不同类型的两个表。与UNION ALL计划对我来说看起来不错。你可以添加一个TOP 1让它在找到第一行后停止查找。

CREATE TABLE #current (id INT PRIMARY KEY, DATA CHAR(10)) 
CREATE TABLE #ARCHIVE (id INT PRIMARY KEY, DATA CHAR(10)) 

INSERT INTO #current 
SELECT 1, 'A' UNION ALL SELECT 2, 'B' 

INSERT INTO #ARCHIVE 
SELECT 101, 'C' UNION ALL SELECT 102, 'D' 

DECLARE @id INT 
SET @id = 102 

;WITH things AS 
(
SELECT * FROM #current 
UNION ALL 
SELECT * FROM #ARCHIVE 
) 

SELECT TOP (1) id,DATA 
FROM things 
WHERE id = @id 
0

您可以创建一个view

CREATE VIEW all_records 
AS 
SELECT * from current 
UNION ALL 
SELECT * from archive 

,并从视图中选择记录:

select * from all_records 
0

我可以建议该变种

select coalesce((select someData from One where Id = 12345), (select someData from Two where Id = 12345))