在子查询之外移动过滤器时丢失SQL结果

时间:2014-11-11 22:03:06

标签: sql oracle oracle-sqldeveloper

我有以下SQL查询可以正常工作:

SELECT purchase_id, rn
FROM 
(
   SELECT vrd.purchase_id, 
          af.date as affiliation_date,
          row_number() over (partition by af.customer_id order by af.date desc) as rn

   FROM v_details vrd
   LEFT OUTER JOIN affiliates af
     ON vrd.customer_id = af.customer_id AND af.date <= vrd.purchase_date

   WHERE vrd.date >= DATE'2012-12-01'
     AND purchase_id = 1122996729
) 
WHERE rn = 1

但是,当我将id过滤器移出子查询时,我收到以下错误:

ORA-01878: specified field not found in datetime or interval
01878. 00000 -  "specified field not found in datetime or interval"
*Cause:    The specified field was not found in the datetime or interval.
*Action:   Make sure that the specified field is in the datetime or interval.

以下是查询:

SELECT purchase_id, rn
FROM 
(
   SELECT vrd.purchase_id, 
          af.date as affiliation_date,
          row_number() over (partition by af.customer_id order by af.date desc) as rn

   FROM v_details vrd
   LEFT OUTER JOIN affiliates af
     ON vrd.customer_id = af.customer_id AND af.date <= vrd.purchase_date

   WHERE vrd.date >= DATE'2012-12-01'
) 
WHERE rn = 1
  AND purchase_id = 1122996729

问题的一些背景:

每个客户可以有很多从属关系,每个联盟都有一个关联日期(当关系开始时)。随着时间的推移,可以添加或删除附属关系,因此它们也有end_date。

因此,对于购买表中的给定行,我想知道每个客户最近的联属关系。

我正在加入对关联公司表的购买,以便查看每个客户的总关联。因此,对于每次购买,它会为他们曾经拥有的每个联盟返回一行。但是,根据购买日期(vrd.purchase_date),我想看看他们最近的联系是什么。因此按关联日期(af.date)排序。

我接近这个错误的方式吗?如果没有,我该怎么做才能纠正过滤?

我想在子查询之外进行过滤的原因是因为我想将其转换为可以上传到BI工具的视图。但是,当我将其创建为视图并尝试使用where子句(无论其数据类型)进行查询时,我得到相同的错误。

感谢任何帮助。

谢谢。

1 个答案:

答案 0 :(得分:1)

为子查询添加别名

SELECT purchase_id, rn
FROM 
(
   SELECT vrd.purchase_id, 
          af.date as affiliation_date,
          row_number() over (partition by af.customer_id order by af.date desc) as rn

   FROM v_details vrd
   LEFT OUTER JOIN affiliates af
     ON vrd.customer_id = af.customer_id AND af.date <= vrd.purchase_date

   WHERE vrd.date >= DATE'2012-12-01'
) T
WHERE rn = 1
  AND purchase_id = 1122996729