【问题标题】:SQL Server JOIN/APPLY QuerySQL Server JOIN/APPLY 查询
【发布时间】:2017-03-04 10:38:27
【问题描述】:

我应该使用什么连接来根据下面的虚拟表获得所需的输出

明细表

x------------------------------x
| empID | empName | date       |
x------------------------------x
| 1     | emp1    | 10/01/2016 |
| 1     | emp1    | 10/03/2016 |
| 1     | emp1    | 10/04/2016 |
| 1     | emp1    | 10/05/2016 |
| 1     | emp1    | 10/06/2016 |
x------------------------------x

列表日期为 2016 年 10 月 1 日至 2016 年 10 月 15 日

x------------x
| date       |
x------------x
| 10/01/2016 |
| 10/02/2016 |
| .......... |
| .......... |
| 10/15/2016 |
x------------x

我的查询所需的输出

x------------------------------x
| empID | empName | date       |
x------------------------------x
| 1     | emp1    | 10/01/2016 |
| null  | null    | 10/02/2016 |
| 1     | emp1    | 10/03/2016 |
| 1     | emp1    | 10/04/2016 |
| 1     | emp1    | 10/05/2016 |
| 1     | emp1    | 10/06/2016 |
| null  | null    | 10/07/2016 |
| null  | null    | 10/08/2016 |
| null  | null    | 10/09/2016 |
| null  | null    | 10/10/2016 |
| null  | null    | 10/11/2016 |
| null  | null    | 10/12/2016 |
| null  | null    | 10/13/2016 |
| null  | null    | 10/14/2016 |
| null  | null    | 10/15/2016 |
x------------------------------x

【问题讨论】:

  • 为什么empID 用于不匹配的记录?
  • 我忘记更改所需的输出 empID,如果日期范围列表中没有匹配的日期,则 empName 应为空

标签: sql sql-server-2008 join cross-apply outer-apply


【解决方案1】:

答案是OUTER JOIN,它可以是LEFTRIGHT,具体取决于您使用detail 表的位置。

SELECT D.empid, 
       D.empname, 
       LD.[date] 
FROM   detail D 
       RIGHT OUTER JOIN list_dates LD 
                     ON D.[date] = LD.[date] 

你也可以使用OUTER APPLY

SELECT D.empid, 
       D.empname, 
       LD.[date] 
FROM   list_dates LD 
       OUTER apply (SELECT * 
                    FROM   detail D 
                    WHERE  D.[date] = LD.[date]) D 

【讨论】:

    【解决方案2】:

    看起来你只需要一个outer join

    select e.empid, e.empname, d.date
    from dates d 
       left join detail e on d.date = e.date
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多