【问题标题】:How to get data preferentially from the joined tables in SQL Server如何优先从 SQL Server 中的联接表中获取数据
【发布时间】:2016-10-13 15:11:10
【问题描述】:

我在 SQL Server 中工作。我有三个表,TableATableBTableMain,以及 DateStartTimeFinishTime 列。

我必须编写一个 SQL 语句,它必须从 TableMain 中提取这三个列值。如果TableA 中存在相同的日期,则StartTime 值应该来自它,否则只需使用来自TableMain 的值。同样,如果FinishTime 出现在TableB 中,那么在最终输出中,该值应替换TableMain 中的值。

我想通过加入这三个表来做到这一点。下面展示了这三个表中的数据以及最终预期的查询输出。

表A

Date        StartTime
10/14/2016  11:00 AM
10/16/2016  10:00 AM
10/18/2016  11:30 AM

表B

Date        FinishTime
10/15/2016  3:00 PM
10/16/2016  4:00 PM
10/17/2016  6:30 PM
10/18/2016  5:00 PM

TableMain

Date        StartTime   FinishTime
10/14/2016  8:00 AM     10:00 PM
10/15/2016  8:00 AM     10:00 PM
10/16/2016  8:00 AM     10:00 PM
10/17/2016  8:00 AM     10:00 PM
10/18/2016  8:00 AM     10:00 PM

期望的输出:

10/14/2016  11:00 AM    10:00 PM
10/15/2016  8:00 AM     3:00 PM
10/16/2016  10:00 AM    4:00 PM
10/17/2016  8:00 AM     6:30 PM
10/18/2016  11:30 AM    5:00 PM

【问题讨论】:

  • 您所需要的只是一些左连接和一个派生表结果。请参阅下面的答案。
  • 如果有人更新和编辑sql标签中的问题最好是marc_s谢谢@marc_s
  • @JonH:噢,非常感谢,乔恩!

标签: sql sql-server


【解决方案1】:

COALESCE 也可以在这里工作,无需所有 CASE 语句:

SELECT tablemain.date,
COALESCE(tablea.starttime, tablemain.starttime),
COALESCE (tableb.finishtime, tablemain.finishtime)
FROM tablemain
LEFT JOIN tablea
ON tablemain.date = tablea.date
LEFT JOIN tableb
ON tablemain.date = tableb.date

COALESCE 采用系列中的第一个非 NULL 值。因此,如果表 a 中有开始日期,它将采用该日期。如果没有,它将从主表中获取开始日期。相同的逻辑适用于完成日期和表 b

【讨论】:

    【解决方案2】:

    真正未经测试,但像这样:

    SELECT
       t.DateVal,
       t.Start,
       t.Finish
    FROM
    (
    SELECT
       tm.DateVal AS DateVal,
       CASE WHEN a.Start IS NOT NULL THEN a.Start ELSE tm.Start END AS Start,
       CASE WHEN b.Finish IS NOT NULL THEN b.Finish ELSE tm.Finish END AS Finish
    FROM 
       TableMain tm
    LEFT JOIN
       TableA a
    ON
       a.DateVal = tm.DateVal
    LEFT JOIN
       TableB b
    ON
       b.DateVal = tm.DateVal
    ) t
    

    这里的关键是您使用了一些左连接、一个 case 语句和一个派生表结果(在本例中为 t)。请注意我的列名,只需更改您的列名即可。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 2016-03-14
      • 2015-07-20
      • 2019-04-25
      • 2010-11-13
      相关资源
      最近更新 更多