如果 id 不存在于另一个表中,则根据条件使用 sql 计算 id 的编号

Posted

技术标签:

【中文标题】如果 id 不存在于另一个表中,则根据条件使用 sql 计算 id 的编号【英文标题】:Count the no of id if it is not present in another table based on condition using sql 【发布时间】:2013-05-08 13:24:13 【问题描述】:

我有一个包含 RepId 及其日期的表格。

Table: 1
RepID   Date
108981  2013-04-09 00:00:00.000
108981  2013-04-09 00:00:00.000
108982  2013-04-10 00:00:00.000
108982  2013-04-11 00:00:00.000
108983  2013-04-11 00:00:00.000
108983  2013-04-11 00:00:00.000

我有另一个表,其中包含 RepId 和它们的 logTime。

Table: 2
repID   logTime
108981  2013-04-09 00:00:00.000
108981  2013-04-09 00:00:00.000
108982  2013-04-11 00:00:00.000
108983  2013-04-11 00:00:00.000
108983  2013-04-11 00:00:00.000
108984      2013-04-10 00:00:00.000

当表 2 中的代表不存在日志时间时,我想要表 1 中的 RepId 计数。

在这种情况下,我需要输出为

repId       RepCount
108982      1

因为 RepId - 108982 的表 2 中不存在日期“2013-04-10 00:00:00.000”。

我已将查询用作

select
    t1.RepID, count(t1.RepID) as 'Rep Count'
from
    table1 t1
where
    not exists
    (select t2.repID from table2 t2 where
     CONVERT(date, t2.logTime) between '2013-04-08 00:00:00.000' and '2013-04-11 00:00:00.000')
group by
    t1.RepID

但它总是什么也不返回。请帮助解决这个问题....

【问题讨论】:

没有主键?这两个表都有重复的行。 【参考方案1】:

您可以在此处使用 LEFT OUTER JOIN。

SELECT 
  t1.repID, COUNT(t1.repID)  
FROM
  table1 t1
LEFT OUTER JOIN
  table2 t2
ON
  t1.repID = t2.repID
AND
  t1.Date = t2.logTime
WHERE
  t2.repID IS NULL
GROUP BY
  t1.repID

【讨论】:

【参考方案2】:

我想你想表达为not in

select t1.RepID, count(t1.RepID) as 'Rep Count'
from table1 t1
where t1.repid not in (select t2.repID
                       from table2 t2
                       where CONVERT(date, t2.logTime) between '2013-04-08 00:00:00.000' and '2013-04-11 00:00:00.000'
                       )
group by t1.RepID

或者使用相关子查询或left outer join

您的查询的问题是您正在寻找在此期间 any 记录的存在(或不存在),并且必须存在。您确实想查找给定 repId 的记录。

【讨论】:

【参考方案3】:

问题在于您没有将 not exists 中的子查询与外部查询相关联,因此 not exists 子句始终返回 false。试试这样的:

select
    t1.RepID, count(t1.RepID) as 'Rep Count'
from
    table1 t1
where
    not exists
    (select t2.repID from table2 t2 where t2.repId = t1.repId and
     CONVERT(date, t2.logTime) between '2013-04-08 00:00:00.000' and '2013-04-11 00:00:00.000')
group by
    t1.RepID

【讨论】:

【参考方案4】:
select
    t1.RepID, count(t1.RepID) as 'Rep Count'
from
    table1 t1
where
    not exists
    (select * from table2 t2 where
     t2.RepID = t1.RepID and t2.LogTime = t1.Date)
group by
    t1.RepID

SQLFiddle Demo

【讨论】:

【参考方案5】:

between 将涵盖给定的开始和结束日期以及table2 logtime 2013-04-11 00:00:00.000 将处于介于两者之间的条件,这就是您没有获得任何记录的原因

你应该使用r.RepId not in

看这个演示,SQLFiddle DEMO

您使用 > 和

select
    t1.RepID, count(t1.RepID) as 'Rep Count'
from
    table1 t1
where t1.RepID
    not in
    (select t2.repID from table2 t2 where
     t2.logTime > '2013-04-08 00:00:00.000' and t2.logTime < '2013-04-11 00:00:00.000')
group by
    t1.RepID

或者你的结果是正确的 更改您的 table2 值

108982, '2013-04-11 01:00:00.000'


select
    t1.RepID, count(t1.RepID) as 'Rep Count'
from
    table1 t1
where t1.RepID
    not in
    (select t2.repID from table2 t2 where
     t2.logTime between '2013-04-08 00:00:00.000' and '2013-04-11 00:00:00.000')
group by
    t1.RepID

【讨论】:

以上是关于如果 id 不存在于另一个表中,则根据条件使用 sql 计算 id 的编号的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 根据记录是不是存在于另一个表中选择布尔值

在一个表中查找不存在于另一个表中的ID

如果 ID 存在于另一个表中,则拉行

Google Script:如果行中的值存在于另一个工作表中,则删除行

如果所有记录都存在于 sql server 的另一个表中,则返回行列表

从一个表中返回不存在于另一个表中的值