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 中创建的函数:“函数...不存在”

ORA-00942: 表或视图不存在(在单独的 sql 中有效,但在 oracle 函数中无效)

oracle语句中when条件接不存在怎么写

PL/SQL - 仅当记录不存在时才插入记录

关于如何使用存在和不存在的 PL/SQL 查询的问题

动态 SQL 不存在绑定变量