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的intweekDay
是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'
这两张表看起来完全一样这两张表看起来完全一样