Sql 取消匹配查询未返回预期结果

Sql 取消匹配查询未返回预期结果,sql,oracle,left-join,Sql,Oracle,Left Join,我不能提供样本数据,请提前道歉。我希望能从概念上回答我的问题 我需要表a中缺少表B中相应事务的事务列表。以下是我的简化代码: SELECT DISTINCT a.*columns* FROM TableA a LEFT JOIN (SELECT DISTINCT Customer_ID ,Transaction_Date FROM TableB) b ON a.Customer_ID = b.Customer_ID

我不能提供样本数据,请提前道歉。我希望能从概念上回答我的问题

我需要表a中缺少表B中相应事务的事务列表。以下是我的简化代码:

SELECT DISTINCT
    a.*columns*
FROM TableA a
LEFT JOIN
      (SELECT DISTINCT
          Customer_ID
          ,Transaction_Date
       FROM TableB)
   b ON a.Customer_ID = b.Customer_ID
     AND TO_DATE(b.Transaction_Date,'YYYY-MM-DD') BETWEEN TO_DATE((a.Transaction_Date - 30), 'YYYY-MM-DD') AND TO_DATE((a.Transaction_Date + 1), 'YYYY-MM-DD')
WHERE (b.Customer_ID||b.Date) IS NULL
我希望返回表a中的记录列表,其中表B在前30天中不包含记录。相反,我总是从表A返回结果,在QCing时,确实有表B匹配,有时与表A在同一天


似乎我的查询是作为一个内部联接工作的,而我想要的却是相反的—只在表a中列出一系列内容。

从概念上讲,
DATE
在Oracle中是无效的列名

所有那些迄今为止的电话看起来都可疑;“日期”列的数据类型是什么

  • 如果
    DATE
    ,则将其转换为
    DATE
    数据类型是无用的
  • 如果
    VARCHAR2
    ,那么是-使用带有适当格式掩码的
    TO_DATE
    ,但是
    a.DATE-30
    应该返回什么?什么是AFX52-30

我的建议是先对数据类型进行排序,然后继续。样本数据肯定会帮助我们帮助您。

我不能100%确定我的取消匹配是否由于不必要的日期转换的一些奇怪之处而失败,或者是因为连接两个
NULL
字段会产生另一个
NULL
。可能两者都有!无论如何,以下代码按预期工作:

SELECT DISTINCT
    a.*columns*
FROM TableA a
LEFT JOIN
      (SELECT DISTINCT
          Customer_ID
          ,Transaction_Date
       FROM TableB)
   b ON a.Customer_ID = b.Customer_ID
     AND TO_DATE(b.Transaction_Date,'YYYY-MM-DD') BETWEEN (a.Transaction_Date - 30) AND (a.Transaction_Date + 1)
WHERE (b.Customer_ID IS NULL AND b.Transaction_Date IS NULL)
调试时对我有帮助的一个练习是:

  • 注释掉
    where
    子句
  • b.Customer\u ID
    b.Transaction\u Date
    添加到
    select
    子句中
  • 查看
    TableB
    中缺少的一些值是否确实在联接中创建了
    NULL
    s

  • 也许这对我很有帮助,因为我是个白痴,但实际上看到结果后,我觉得我应该简单地使用
    ,而不是串联。

    DATE
    实际上并不叫它,为了清楚起见,编辑了这篇文章。我也对迄今为止的电话感到不舒服。在表A中,
    TRANSACTION\u DATE
    DATE
    数据类型。在表B中,
    VARCHAR2
    。我的思考过程是,我不知道从日期中减去30是否会使其保持相同的格式类型,因此我使用了额外的
    TO_date
    ,以确保它与表B的日期匹配。这有什么意义吗?编辑后,仍在使用to_DATE将表的事务日期(已经是日期数据类型)转换为“另一个”日期。应该是
    。。。在a.transaction_date-30和a.transaction_date+1之间,就这么简单。对于其余部分,正如我所说的,我更喜欢看到样本数据。我想象的通常不是人们真正拥有的。