如果数据存在,如何从第二个表获取列,否则应返回null?

时间:2015-08-12 02:15:37

标签: sql sql-server join

我正在努力学习SQL Joins概念,当我试图获得学生出勤记录时,我正面临着问题。有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_holiday表共享的st_id 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 in attendance和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

1 个答案:

答案 0 :(得分:2)

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

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