Oracle sql select查询返回不是mach到where子句的id

时间:2016-09-14 06:47:26

标签: sql oracle select

如果id在数据范围之外有一行或多行,我的查询工作正常。但是如果id有例如2行 - 第一个过时的范围而第二个在数据范围内,则查询返回此ID。

SELECT DISTINCT na.public_id
  FROM na_agent_cients na
  JOIN tt_call cc
  ON na.public_id=cc.primary_contact_id
  WHERE cc.call_date NOT BETWEEN TO_DATE('10/09/2016', 'dd/mm/yyyy') AND TO_DATE('13/09/2016', 'dd/mm/yyyy')

所以例如,如果我有一个id,这个id首先有两行,日期是05/09/2016,第二行是日期11/09/2016,查询会返回给我这个ID,这是错误的。

2 个答案:

答案 0 :(得分:2)

此ID存在于日期范围内 的行中,因此应返回该ID。如果您要排除显示在范围之外的行中的所有ID,您可以使用not exists运算符执行此操作:

SELECT DISTINCT na.public_id
FROM   na_agent_cients na
WHERE  NOT EXISTS (SELECT * 
                   FROM   tt_call cc
                   WHERE  na.public_id = cc.primary_contact_id AND
                          cc.call_date NOT BETWEEN 
                                       TO_DATE('10/09/2016', 'dd/mm/yyyy') AND 
                                       TO_DATE('13/09/2016', 'dd/mm/yyyy'))

答案 1 :(得分:1)

您需要Group byHaving子句。

将条件移至having子句并仅在不满足条件时计数,仅在所有行未落在给定日期范围之间时才拉public_id

SELECT na.public_id
FROM   na_agent_cients na
       JOIN tt_call cc
         ON na.public_id = cc.primary_contact_id
GROUP  BY na.public_id
HAVING sum(CASE
               WHEN cc.call_date NOT BETWEEN To_date('10/09/2016', 'dd/mm/yyyy') AND To_date('13/09/2016', 'dd/mm/yyyy') THEN 0 else 1
             END) = 0