我有两张表,两列都有相同的列。
第一个表包含原始源数据,第二个表包含对未插入原始数据的数据OR值的修订。
这些表将用于视图中,如果数据具有显示的修订版 - 如果没有,则显示原始源数据。
通常情况下,这可以使用左连接,但插入的修订版让我很困惑如何出于性能原因这样做。
以下示例应该有助于更好地解释
DECLARE @t1 TABLE (TimeStamp datetime,Value int)
DECLARE @t2 TABLE (TimeStamp datetime,Value int)
INSERT INTO @t1 (TimeStamp,Value) VALUES ('2000-01-01',10)
INSERT INTO @t1 (TimeStamp,Value) VALUES ('2000-01-02',15)
INSERT INTO @t1 (TimeStamp,Value) VALUES ('2000-01-04',5)
INSERT INTO @t1 (TimeStamp,Value) VALUES ('2000-01-05',18)
INSERT INTO @t1 (TimeStamp,Value) VALUES ('2000-01-06',12)
INSERT INTO @t2 (TimeStamp,Value) VALUES ('2000-01-03',12)
INSERT INTO @t2 (TimeStamp,Value) VALUES ('2000-01-05',20)
INSERT INTO @t2 (TimeStamp,Value) VALUES ('2000-01-06',15)
--SELECT STATEMENT HERE
我需要输出如下:
TimeStamp Value
----------------------- -----------
2000-01-01 00:00:00.000 10
2000-01-02 00:00:00.000 15
2000-01-03 00:00:00.000 12
2000-01-04 00:00:00.000 5
2000-01-05 00:00:00.000 20
2000-01-06 00:00:00.000 15
因此,1月1日的值存在,第5和第6的值取自@ t2,而@ t1的值不在输出中。
我正在使用SQL Server 2005应该有所不同
答案 0 :(得分:4)
SELECT
isnull(tbl2.timestamp, tbl1.timestamp) as TimeStamp,
isnull(tbl2.value,tbl1.value) as Value
FROM
@t1 tbl1
FULL OUTER JOIN @t2 tbl2 on tbl1.timestamp=tbl2.timestamp
这完全你需要什么。这是本书和唯一正确的方法。这是一项微不足道的任务,只有正确的解决方案。其他任何事情都会复杂得多,而且速度慢。
答案 1 :(得分:0)
你可以用联盟来解决它:
SELECT * FROM t1
WHERE NOT EXISTS (SELECT * FROM t2 WHERE t2.TimeStamp = t1.TimeStamp)
UNION
SELECT * FROM t2
显然,如果表没有相同的结构,那么你需要明确地列出列(无论如何这都是好的做法)。