SQL Server从多个表中选择

SQL Server从多个表中选择,sql,sql-server,Sql,Sql Server,我正在创建时间表应用程序,并具有以下表格 tblTimeEntry: -entryID (int) -entryDate (datetime) -enteredDate (datetime) -entryUser (int) -entryJob (int) -entryTask (int) -entryWeekNo (int) tblWagesWeeks: -weekID (int) -weekDay (int) -date (datetime) tblWagesWeeks包含weekID,

我正在创建时间表应用程序,并具有以下表格

tblTimeEntry

-entryID (int)
-entryDate (datetime)
-enteredDate (datetime)
-entryUser (int)
-entryJob (int)
-entryTask (int)
-entryWeekNo (int)
tblWagesWeeks

-weekID (int)
-weekDay (int)
-date (datetime)
tblWagesWeeks
包含
weekID
,这是一个每周分配一个int的int
weekDay
是1-7之间的整数,将整数分配给一周中的每一天。已在
tblWagesWeeks
中输入了三年的日期,并带有相应的
weekDay
编号和
weekID
编号

tblTimeEntry
用于记录分配给日期的时间条目

tblTimeEntry.entryWeekNo
tblWagesWeeks.weekID
匹配,是一个表示周数的整数
tblTimeEntry.entryDate
匹配
tblWagesWeeks.date
并且是
datetime

因此,对于前端,我将显示一个显示周数的列表视图。用户单击一周并显示该周的天数。当用户单击某一天时,他们可以输入时间条目

我遇到的问题是,当我尝试使用以下查询列出一周的时间条目时

SELECT 
    *,   
    CONVERT(varchar(19),CONVERT(date,date,106),103) AS dateFormatted,
    CASE 
       WHEN entryHalfDay = '1' 
          THEN 'Half Day' 
       WHEN entryHalfDay = '0' 
          THEN '' 
    END AS [entryHalfDayString], 
    CASE 
       WHEN entryFullDay = '1' 
         THEN 'Full Day' 
       WHEN entryFullDay = '0' 
         THEN '' 
    END AS [entryFullDayString], 
    CASE 
       WHEN enteredDate IS NULL 
          THEN '' 
          ELSE 'Entry Complete' 
    END AS dayStatus 
FROM 
    tblWagesWeeks AS a 
LEFT JOIN 
    tblTimeEntry AS b ON a.[date] = b.entryDate 
WHERE 
    (entryUser = '1' OR entryUser IS NULL) AND weekID = '25'
我的问题是,如果我正在搜索的用户(上面查询中的“1”)在某个特定日期没有时间条目,但另一个用户有,则空日期不会显示在列表中,因此用户没有机会输入该日期的时间

下面是上面查询的输出,以演示

weekID  weekDay date    entryID entryDate   enteredDate entryUser   entryJob    entryTask   entryFullDay    entryHalfDay    entryWeekNo dateFormatted   entryHalfDayString  entryFullDayString  dayStatus
25  1   2015-06-15  23  2015-06-15  2015-07-14  1   5   5   1   0   25  15/06/2015      Full Day    Entry Complete
25  2   2015-06-16  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    16/06/2015  NULL    NULL    
25  3   2015-06-17  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    17/06/2015  NULL    NULL    
25  4   2015-06-18  26  2015-06-18  2015-07-14  1   2   2   1   0   25  18/06/2015      Full Day    Entry Complete
25  5   2015-06-19  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    19/06/2015  NULL    NULL    
25  7   2015-06-21  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    21/06/2015  NULL    NULL    
正如你所看到的,第六天不见了

当我使用entryUser=25搜索同一周时,您可以看到第6天有一个条目

SELECT *, CONVERT(varchar(19),CONVERT(date,date,106),103) AS dateFormatted,
CASE WHEN entryHalfDay='1' THEN 'Half Day' WHEN entryHalfDay='0' THEN '' END AS [entryHalfDayString], 
CASE WHEN entryFullDay='1' THEN 'Full Day' WHEN entryFullDay='0' THEN '' END AS [entryFullDayString], 
CASE WHEN enteredDate IS NULL THEN '' ELSE 'Entry Complete' END AS dayStatus 
FROM tblWagesWeeks AS a LEFT JOIN tblTimeEntry AS b ON a.[date] = b.entryDate 
WHERE (entryUser = '25' OR entryUser IS NULL) AND weekID = '25'

weekID  weekDay date    entryID entryDate   enteredDate entryUser   entryJob    entryTask   entryFullDay    entryHalfDay    entryWeekNo dateFormatted   entryHalfDayString  entryFullDayString  dayStatus
25  1   2015-06-15  23  2015-06-15  2015-07-14  1   5   5   1   0   25  15/06/2015      Full Day    Entry Complete
25  2   2015-06-16  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    16/06/2015  NULL    NULL    
25  3   2015-06-17  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    17/06/2015  NULL    NULL    
25  4   2015-06-18  26  2015-06-18  2015-07-14  1   2   2   1   0   25  18/06/2015      Full Day    Entry Complete
25  5   2015-06-19  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    19/06/2015  NULL    NULL    
25  7   2015-06-21  NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    21/06/2015  NULL    NULL    
因此,我需要知道如何始终在列表中显示所有周日,为单个用户和单个周数显示为空白并填充


非常感谢您的帮助。

您需要将join和week的用户条件作为主表的条件,如下所示:

SELECT *, CONVERT(varchar(19),CONVERT(date,date,106),103) AS dateFormatted,
CASE WHEN entryHalfDay='1' THEN 'Half Day' WHEN entryHalfDay='0' THEN '' END AS [entryHalfDayString], 
CASE WHEN entryFullDay='1' THEN 'Full Day' WHEN entryFullDay='0' THEN '' END AS [entryFullDayString], 
CASE WHEN enteredDate IS NULL THEN '' ELSE 'Entry Complete' END AS dayStatus 
FROM tblWagesWeeks AS a 
LEFT JOIN tblTimeEntry AS b ON a.[date] = b.entryDate AND b.entryUser = 25
WHERE a.weekID = '25'

您需要将join的用户条件和week设置为主表的条件,如下所示:

SELECT *, CONVERT(varchar(19),CONVERT(date,date,106),103) AS dateFormatted,
CASE WHEN entryHalfDay='1' THEN 'Half Day' WHEN entryHalfDay='0' THEN '' END AS [entryHalfDayString], 
CASE WHEN entryFullDay='1' THEN 'Full Day' WHEN entryFullDay='0' THEN '' END AS [entryFullDayString], 
CASE WHEN enteredDate IS NULL THEN '' ELSE 'Entry Complete' END AS dayStatus 
FROM tblWagesWeeks AS a 
LEFT JOIN tblTimeEntry AS b ON a.[date] = b.entryDate AND b.entryUser = 25
WHERE a.weekID = '25'

这两张表看起来完全一样这两张表看起来完全一样