【问题标题】:How to get columns from second table only if data exists otherwise should return null?仅当数据存在时如何从第二个表中获取列,否则应返回null?
【发布时间】:2015-08-12 02:15:36
【问题描述】:

我在 SQL 连接概念上苦苦挣扎,并且在尝试获取学生出勤记录时遇到了问题。有 3 个表必须使用。

attendance a - has all student attendance

st_holiday b, - 学生特定假期公开名单 hol_list c - 包括周末在内的所有假期清单

有两个问题: 1. 我需要给我 in_time、out_time 和 holiday_type 的数据。学生也可以在假期上课(可以是公共假期或周末)。

我尝试了下面的查询,它只给了我假期参加的日期。

select a.student_id, a.in_time, a.out_time, b.holiday_type
from attendance a, st_holiday b, hol_list c
where a.st_id = b.st_id
and b.holiday = c.id
and a.date = c.hol_date

我也尝试过使用left outer join st_holiday on a.st_id = b.st_id and left outer join holiday_type on a.date = c.hol_date 但它为我提供了所有数据,并且对于每个数据,holiday_type 显示为假日/周末等。

2. How to parameterize by date. I need to provide the data as sql script with date range parameterized. How to do the same in Sql Server. I tried using 

DECLARE from_date='2015-04-01 00:00:00.000'
DECLARE to_date='2015-04-01 00:00:00.000'

SELECT * FROM TABLE 
WHERE .... 
AND [PI].Date BETWEEN ISNULL(@FromDate, [PI].Date) AND ISNULL(@ToDate, [PI].Date)

我使用下面的链接作为参考。 sql server optional parameters: syntax for between clause 任何帮助将不胜感激。

更新:表结构。 出席 a - 主键 ID,st_id 与 st_holiday 表共享 st_holiday b, - pk 是 ID,假期与 hol_list 表共享 hol_list c - hol_date 可以与出勤表的日期一起使用。

预期输出:

St_id       IN_TIME            OUT_TIME                 Hol_type
1234  2015-08-07 08:00:00.000  2015-08-07 17:00:00.000  null
1234  2015-08-08 08:00:00.000  2015-08-08 08:00:00.000  Weekend

表结构:st_id 出勤表和st_holiday 表不是唯一的。该值将被重复。例如。 st_holiday 中的 eah st_id 将有 20 个假期,即 st_id 重复 20 次。出席表 st_id 将取决于否。学生进出教室的次数。

attendance 
    -------------
    st_id         in_time              out_time      time_in_class
    3370    2009-10-8 11:54:0.0 2009-10-8 18:1:0.0  6.11666666666667
    4209            0                     0               0
    4225            0                     0               0
    3779    2009-10-8 14:27:0.0 2009-10-9 0:5:0.0   9.63333333333333


    hol_list
    -------------
    id           hol_date          type        desc             holiday_type

    229 2007-04-06 00:00:00.000     1       Good Friday             Holiday
    231 2007-05-01 00:00:00.000     1       International Labor Day Holiday
    233 2007-07-04 00:00:00.000     1       Independence Day        Holiday
    234 2007-07-07 00:00:00.000     1       Weekend                 Weekend


    st_holiday
    -------------
    st_id   holiday     holiday_type
     9201   39965         Holiday
     9201   39961         Holiday
     9201   39951         Holiday
     9201   39942         Holiday
     9201   39935         Weekend
     9201   39927         Holiday

【问题讨论】:

  • 能否提供表格结构、一些示例数据和预期结果?
  • st_holidayhol_list 有什么关系? holiday 是什么数据类型?
  • hol_list 主键 id 映射为 st_holiday 表中的假日。
  • 我建议你创建一个SQL FIDDLE 这样很容易重现你的问题并给你一个合适的解决方案。
  • 当人们询问表结构时,如果您将其提供为 CREATE TABLE 语句(您可以通过右键单击 SSMS 中的表并选择将表格编写为 -> 创建到并选择要发送到的位置)。这样,其他人可以直接将这些定义复制并粘贴到他们的 SQL Server 中,并且更接近于准备好帮助您。同样,INSERT 语句是呈现示例数据的好方法 - 因为,同样,我们可以将其复制并粘贴到 SSMS 中,并准备好处理实际查询。而不必解释。

标签: sql sql-server join


【解决方案1】:

根据您的示例查询和解释。对于您的第一个问题,请尝试一下:

select a.student_id, a.in_time, a.out_time, b.holiday_type
from attendance a 
left join st_holiday b on a.st_id = b.st_id
inner join hol_list c on a.date = c.hol_date

【讨论】:

  • 我试过你的查询,它仍然只给出假期进出时间。但我得到了多行相同的数据。
  • 表结构:出勤 ------------- st_id in_time out_time time_in_class hol_list ------------- id hol_date type desc st_holiday -- ----------- st_id holiday holiday_type
  • @razor 表结构比较混乱,能否给每张表的示例数据?
  • 我这样修改了您的查询:从出勤中选择 a.student_id、a.in_time、a.out_time、b.holiday_type a left join st_holiday b on a.st_id = b.st_id inner join hol_list c在 c.id = b.holiday.. 这给了我假期 b.desc 重复...但进出时间是正确的。
猜你喜欢
  • 2018-04-24
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 2022-10-03
  • 2020-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多