致歉。我希望我的问题可以从概念上得到解答。
我想要表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联接工作。
答案 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)
在调试时对我有用的一项练习是:
where
子句b.Customer_ID
子句中添加b.Transaction_Date
和select
TableB
缺少的某些值确实在联接中创建了NULL
。也许这对我很有帮助,因为我是个白痴,但是实际上看到结果只是单击,我应该尝试仅使用AND
而不是串联。