【问题标题】:Returning values from a temp table if another temp table returns no rows如果另一个临时表没有返回行,则从一个临时表返回值
【发布时间】:2015-11-05 09:16:11
【问题描述】:

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

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

 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' 感兴趣,因此是 'case when'

所以我最后想要得到的是:

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 

【问题讨论】:

  • 从故事中不清楚您到底想要什么,SQL 本身根本无法解释。请您创建并提供一些示例数据以及您期望的输出。如果需要,您可以使用 SqlFiddle 或 t-SQL flex 来提供数据。

标签: sql-server date


【解决方案1】:

您没有提供示例数据,只是基于您的 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] );

【讨论】:

    【解决方案2】:

    如果没有示例数据,很难阅读和完全理解您的问题,但您似乎希望根据条件从两个表之一返回值。

    看到两个临时表的架构相同,实现此目的的一种方法是简单地 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 中调用哪个表。

    【讨论】:

      【解决方案3】:

      这是一个例子:

      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 的位置。

      【讨论】:

        【解决方案4】:

        使用 Union 组合两个答案

         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 
        

        【讨论】:

          猜你喜欢
          • 2013-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-10
          • 1970-01-01
          相关资源
          最近更新 更多