2015-11-05 69 views
2

如果另一个临时表返回没有行,我需要编写一个查询以返回一个临时表中的值。如果另一个临时表返回没有行,则从临时表返回值

编辑:整个表具有以下结构

NAME  TYPE DATE  VALUE 
Washington 1 NULL  1000 <--default value 
Washington 2 NULL  750 <--default value 
Washington 3 NULL  500 <--default value 
Washington 1 04.11.2015 500 
Washington 2 04.11.2015 250 
Washington 3 04.11.2015 100 
Washington 1 07.11.2015 600 
Washington 2 07.11.2015 300 
Washington 3 07.11.2015 200 

温度表:Name, type, date, value其中IS NULL返回“默认”的日期值

温度表:Name, Type, date, value其中每个独特Name将具有3种类型( 1,2,3),每种类型都有不同的值,它们都有相同的日期。

当存在日期列中没有条目这意味着该值应为“缺省”,其下的行存储在相同的表,其中日期为空

我也有确定的8个不同的参数值,但

所以,我想在年底得到我只是在“1”兴趣和“2”因此“当”为:

Select * 
from temp1 
where date =GETDATE() 

如果不存在我想要它回来:

select * from temp2. 

我只对明天

后得到了今天,明天和天的结果感兴趣这就是我这么远,但它显然不工作。

我希望得到任何帮助,我可以得到

WITH defaultvalues 
      AS (SELECT DISTINCT 
         n.Name , 
         Type , 
         Value 
       FROM  mytable 
         LEFT JOIN nametable AS n ON mytable.x = r.Id 
                AND Date IS NULL 
      ), 
     changedvalue 
      AS (SELECT DISTINCT 
         n.Name , 
         type , 
         date , 
         CASE WHEN d.Date = GETDATE() 
            AND Parameter = '1' THEN Value 
          WHEN Parameter = '2' THEN '0' 
         END AS CAP 
       FROM  mytable 
         LEFT JOIN nametable AS n ON mytable.x = r.Id 
       WHERE Parameter IN ('1', '2') 
      ) 
    SELECT CASE WHEN NOT EXISTS (SELECT * 
            FROM  changedvalue 
            WHERE changedvalue.Date = GETDATE()) 
       THEN (SELECT * 
         FROM defaultvalues 
        ) 
      END 
+0

它不是从故事中清楚你到底想要什么合并和SQL本身不是说明性的。请你创造和提供一些示例数据和你所期望的输出。您可以使用SqlFiddle如果需要的话或T-SQL弯曲提供数据。 –

回答

2

你没有提供的样本数据,只是立足于您的SQL以为你只是有在最后一部分麻烦:

WITH defaultvalues 
     AS (
      SELECT DISTINCT 
        n.Name, [type], [date], [Value] AS cap 
      FROM mytable 
      LEFT JOIN nametable AS n ON mytable.x = r.Id AND 
             [Date] IS NULL 
      ), 
     changedvalue 
     AS (
      SELECT DISTINCT 
        n.Name, [type], [date], 
        CASE WHEN d.Date = GETDATE() AND 
           Parameter = '1' THEN [Value] 
         WHEN Parameter = '2' THEN '0' 
        END AS CAP 
      FROM mytable 
      LEFT JOIN nametable AS n ON mytable.x = r.Id 
      WHERE Parameter IN ('1', '2') 
      ) 
    SELECT * 
    FROM [changedvalue] 
    UNION 
    SELECT * 
    FROM [defaultvalues] 
    WHERE NOT EXISTS (SELECT * 
         FROM [changedvalue]); 
+0

谢谢!你的答案解决了我的问题:) –

0

这很难阅读并完全理解你的问题没有样本数据,但似乎你正在寻找基于一个条件的两个表的一个返回值。

实现此目的的一种方法是,您看到两个临时表具有相同的模式,只是将UNION结果与条件检查WHERE子句一起使用。

我试着创建一个简化的例子来展示如何使用下面的代码来运行,如果您复制并粘贴到Management Studio中,则可以运行该代码。

CREATE TABLE #temp1 (Name VARCHAR(10), [type] VARCHAR(10), [date] DATE, value int) 
CREATE TABLE #temp2 (Name VARCHAR(10), [type] VARCHAR(10), [date] DATE, value int) 

INSERT INTO #temp1 (Name, type, date, value) 
VALUES ('bob', 'male', '2015-03-12', 123) 


INSERT INTO #temp2 (Name, type, date, value) 
VALUES ('jane', 'female', GETDATE(), 456) 

DECLARE @switch BIT = 1 
-- with @switch set to 1, #temp1 will be returned 
SELECT t1.* 
FROM (SELECT * FROM #temp1 
      WHERE @switch = 1 
      UNION 
      SELECT * FROM #temp2 
      WHERE @switch = 0 
     ) t1 

SET @switch = 0 
--with @switch set to 0, #temp2 will be returned 
SELECT t1.* 
FROM (SELECT * FROM #temp1 
      WHERE @switch = 1 
      UNION 
      SELECT * FROM #temp2 
      WHERE @switch = 0 
     ) t1 

DROP TABLE #temp1 
DROP TABLE #temp2 

我使用的WHERE条件的@switch值,以确定在UNION调用哪个表。

0

下面是一个例子:

WITH defaultvalues 
      AS (SELECT DISTINCT 
         n.Name , 
         Type , 
         Value 
       FROM  mytable 
         LEFT JOIN nametable AS n ON mytable.x = r.Id 
                AND Date IS NULL 
      ), 
     changedvalue 
      AS (SELECT DISTINCT 
         n.Name , 
         type , 
         date , 
         CASE WHEN d.Date = GETDATE() 
            AND Parameter = '1' THEN Value 
          WHEN Parameter = '2' THEN '0' 
         END AS CAP 
       FROM  mytable 
         LEFT JOIN nametable AS n ON mytable.x = r.Id 
       WHERE Parameter IN ('1', '2') 
      ), 
     final 
      AS (SELECT * , 
         RANK() OVER (ORDER BY c) r 
       FROM  (SELECT * , 
            1 AS c 
          FROM  changedvalue 
          UNION ALL 
          SELECT * , 
            2 AS c 
          FROM  defaultvalues 
         ) t 
      ) 
    SELECT * 
    FROM final 
    WHERE r = 1 

你刚才工会结果与c列不同。然后在列c上排名并选择排名等于1的位置。

0

使用联盟两个答案

WITH defaultvalues 
     AS (SELECT DISTINCT 
        n.Name , 
        Type , 
        Value 
      FROM  mytable 
        LEFT JOIN nametable AS n ON mytable.x = r.Id 
               AND Date IS NULL 
     ), 
    changedvalue 
     AS (SELECT DISTINCT 
        n.Name , 
        type , 
        date , 
        CASE WHEN d.Date = GETDATE() 
           AND Parameter = '1' THEN Value 
         WHEN Parameter = '2' THEN '0' 
        END AS CAP 
      FROM  mytable 
        LEFT JOIN nametable AS n ON mytable.x = r.Id 
      WHERE Parameter IN ('1', '2') 
     ) 
     ( SELECT * 
      FROM  changedvalue         
      WHERE changedvalue.Date = GETDATE()) 
      UNION 
     (SELECT * 
      FROM defaultvalues 
      WHERE NOT EXISTS (SELECT 1 FROM changedvalue)) 
     END