SQL服务器从两个可能的表中选择一个
问题描述:
我有两个表,一个当前表和一个存档表。SQL服务器从两个可能的表中选择一个
当一个记录搜索,我不知道它会在哪个表,所以我有一个查询类似以下内容:
SELECT myThing FROM (current UNION archive)
我想知道,是有可能写上面的查询就像
SELECT myThing FROM current
IF myThing IS NULL
BEGIN
SELECT myThing FROM ARCHIVE
END
以及哪一个,哪一个或哪些,或者这些方法可能是更高性能的。
答
你的第二个例子几乎可以正常工作。只需要一个变量
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
更快。
编辑:正如马丁指出的那样,只有在两张表中只有一个匹配的情况下,这一切才是值得的。否则,你需要一个联盟。
答
使用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
答
您可以创建一个view
CREATE VIEW all_records
AS
SELECT * from current
UNION ALL
SELECT * from archive
,并从视图中选择记录:
select * from all_records
答
我可以建议该变种
select coalesce((select someData from One where Id = 12345), (select someData from Two where Id = 12345))
会不会有永远只能是一行返回查询? – 2010-12-02 11:34:34
@Martin,是0或1行 – fearofawhackplanet 2010-12-02 11:40:37