2015-11-05 108 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