【问题标题】:Pulling data from a different table if pertaining data is not available in a table如果表中没有相关数据,则从其他表中提取数据
【发布时间】:2012-04-13 15:43:28
【问题描述】:

我是 sql 新手

我有一个带有 [month]、[forecasted avg.温度]作为列。我有另一个带有 [月] 的表 2,[实际平均值。温度]作为列。现在对于某些日期,表一中没有可用的记录。在这种情况下,如果该表中有可用记录,我想从 table2 中提取记录。

例如,表 1 可能有 2010 年 4 月到 12 月的记录。表 2 有 2010 年 1 月到 12 月的记录。我想从表 2 中提取表 1 中缺失的 jan、feb、mar 月份的记录。

任何想法。我们使用的是 sql server 2008

提前致谢。

【问题讨论】:

    标签: sql tsql


    【解决方案1】:
    select 
       [month], isnull([forecasted avg. temperature], [actual avg. temperature]) as temperature 
    from 
       table2 left outer join table1 on table1.[month] = table2.[month]
    

    更新 根据 Dems 的评论,我更改了查询。原来的帖子听起来好像 table2 包含所有月份的数据,所以我只是切换了,而不是 FULL JOIN,所以它将从 table2 中提取所有记录,并在 table1 可用时加入,继续使用 ISNULL 作为临时。如果 table2 不包含所有数据,则需要 FULL JOIN。

    【讨论】:

    • +0 :A JOIN 最接近我认为 OP 所要求的(尽管它有点模棱两可):如果存在,则从 T1 给出值,否则从 T2 给出值。但是您需要一个FULL OUTER JOIN (如果 T1 中没有行,则您的答案与 JOIN T2 无关)。然后你需要在两个字段上都使用 ISNULL()。
    • 这是一个有趣的横向思考。我要把这个放在我的狡猾计划箱里。
    【解决方案2】:
    select [month], [forecasted avg. temperature] as temperature from table1
    union
    select [month], [actual avg. temperature] as temperature from table2
    

    【讨论】:

    • 如果月份在两个表中,则将两个表都拉出的不同临时工。
    • 请注意,没有特别提到该场景。
    • 如果月份在两个表中,则将两个表都拉出的不同临时工。确实如此。现在,如果两个表中有 r 个重复值,那么我只需要保留表 1 中的温度值
    【解决方案3】:

    一种方法是与外部连接查询联合

    Select  [month], [forecasted avg. temperature] from Table1
    Union
    Select [month], [actual avg. temperature] From Table2
    outer join Table1 on Table1.[Month] = Table2.Month
    Where Table1.Month is null
    

    别想了,看在 Cthulu 的份上,给你的表和列起合法的名字。

    如果您想在输出中使用更友好的名称,请执行以下操作

    Select ForeCastAvgTemp As [forecasted avg. temperature] From Table1
    

    【讨论】:

      猜你喜欢
      • 2021-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多