SQL 不存在函数
Posted
技术标签:
【中文标题】SQL 不存在函数【英文标题】:SQL NOT EXISTS function 【发布时间】:2014-01-20 01:59:19 【问题描述】:我对在 SQL 中使用 NOT EXISTS 函数有疑问
我有 2 张桌子。在一个中,我保存工人的记录,在另一个中,我保存工作了一天的工人的记录。需要帮助:如何选择所有未在特定日期范围内工作的工人,并按该范围内的每一天对他们进行分组。我可以得到所有在那个日期范围内工作过的工人,但不是那些没有在同一日期范围内工作过的工人
表1
用户 ID(整数)表2
用户 ID(整数) DayOfWork(日期时间)例如我如何选择那些工作过的人:
SELECT tableWorkingDay.DayOfWork , tableUsers.UserId
FROM tableWorkingDay INNER JOIN
tableUsers
ON tableWorkingDay.UserId= tableUsers.UserId
WHERE (tableWorkingDay.DayOfWork BETWEEN '1/1/2014' AND '1/31/2014')
GROUP BY tableWorkingDay.DayOfWork, tableUsers.UserId
ORDER BY tableWorkingDay.DayOfWork
【问题讨论】:
您想要在该范围内的任何一天或一天没有工作的人吗? 好吧,我需要那些不工作一天的人。示例:在“2014 年 1 月 1 日”不工作用户 2、3、5 在“2014 年 2 月 1 日”不工作用户 1、2、4 在“2014 年 3 月 1 日”不工作用户 3、5 等等on ...但给出日期范围之间的所有天数(对不起我的英语不好) 【参考方案1】:您希望所有工作人员在日期范围内的某一天都没有工作。我还假设您在表tableWorkingDay
中的某处拥有所有日期。
你需要从日子开始。这是一个查询:
select distinct wd.DayOfWork
from tableWorkingDay wd
where wd.DayOfWork between '2014-01-01' and '2014-01-31'
接下来,您希望将其与所有员工交叉,以获得所有员工和日期的虚拟表。然后对原表使用left join
,选择left join
不匹配的地方:
select days.DayOfWork, users.UserId
from (select distinct wd.DayOfWork
from tableWorkingDay wd
where wd.DayOfWork between '2014-01-01' and '2014-01-31'
) days cross join
(select distinct tu.UserId
from tableUsers tu
) users left outer join
tableWorkingDay wd
on wd.DayOfWork = days.DayOfWork and wd.UserId = users.UserId
where wd.UserId is null
order by 1, 2;
【讨论】:
【参考方案2】:是这样的
SELECT tableWorkingDay.DayOfWork , tableUsers.UserId
FROM tableWorkingDay
INNER JOIN tableUsers ON tableWorkingDay.UserId= tableUsers.UserId
WHERE tableWorkingDay.UserId NOT IN (SELECT twd.UserId FROM tableWorkingDay twd WHERE
twd.DayOfWork BETWEEN '1/1/2014' AND '1/31/2014')
GROUP BY tableWorkingDay.DayOfWork, tableUsers.UserId
ORDER BY tableWorkingDay.DayOfWork
【讨论】:
以上是关于SQL 不存在函数的主要内容,如果未能解决你的问题,请参考以下文章
无法在 sql shell 上执行在 pgAdmin 中创建的函数:“函数...不存在”