不匹配的查询未返回预期结果

时间:2020-10-28 20:57:31

标签: 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
     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中列出的内容似乎是我的查询作为INNER联接工作。

2 个答案:

答案 0 :(得分:1)

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

所有这些TO_DATE呼叫看起来都是可疑的;什么是“ DATE”列的数据类型?

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

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

答案 1 :(得分:0)

我不确定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)

在调试时对我有用的一项练习是:

  1. 注释where子句
  2. b.Customer_ID子句中添加b.Transaction_Dateselect
  3. 直观了解TableB缺少的某些值确实在联接中创建了NULL

也许这对我很有帮助,因为我是个白痴,但是实际上看到结果只是单击,我应该尝试仅使用AND而不是串联。