代码之家  ›  专栏  ›  技术社区  ›  Justin Wignall

SQL视图,其中值出现在两个表中的一个或两个表中

  •  1
  • Justin Wignall  · 技术社区  · 14 年前

    我有两个表,都有相同的列。

    第一个表包含原始源数据,第二个表包含对该数据的修订或在不存在原始数据的情况下插入的值。

    这些表将用于一个视图中,如果数据有显示的修订-如果没有,则显示原始源数据。

    通常情况下,使用左连接是可以的,但是由于性能原因,插入的修订版让我弄不清楚如何做到最好。

    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
    

    所以第3个Jan的值存在,第5个和第6个值取自@t2,而@t1的值不存在于输出中。

    我使用的是SQLServer2005,这有什么区别吗

    2 回复  |  直到 14 年前
        1
  •  4
  •   Alex    14 年前
    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
    

    这是 确切地

        2
  •  0
  •   tdammers    14 年前

    你可以用工会来解决这个问题:

    SELECT * FROM t1 
      WHERE NOT EXISTS (SELECT * FROM t2 WHERE t2.TimeStamp = t1.TimeStamp)
    UNION
    SELECT * FROM t2
    

    显然,如果表没有相同的结构,那么您需要显式地列出列(无论如何这样做可能是一种很好的做法)。