Oracle SQL新手需要帮助查找类似的记录

时间:2014-02-20 20:58:01

标签: sql oracle exists

请原谅我的天真,我是使用Toad的Oracle SQL新手。我有一张销售记录表,称之为销售。它包含客户(CustID)销售日期(SaleDate)和销售商品(ItemID)的记录。它实际上是其他表中的Mview,其中包含最终销售状态。

我正在尝试构建一个查询以返回CustIDSaleDateItemID,如果该客户在同一天出售ItemID = A和ItemID = B,如果在SaleDate 7/1/2013和2013年7月31日之间。如果存在这种情况,我希望使用CustIDSaleDateItemID返回两个记录。我假设这两个记录将在不同的行上。

我一直在研究IN,EXISTS和子查询,但还没有找到正确的方法。该表上有大约700万条记录,所以我需要一些相当有效的东西。有人能指出我正确的方向来实现这一目标吗?我正在学习,但我需要更快地学习:)

GOT IT WOKING!

2014/2/24:嘿,我让它工作了,它会在同一行返回结果。有一点需要注意。在我的原始示例中,我正在寻找5P311和6R641都存在的日期。实际上我想要5P311和RES组中的任何值存在的所有日子 - 其中6R641是其成员。下面的代码实现了我需要的结果:

SELECT  ItemA.CLM_SSN, 
        ItemA.CLM_SERV_STRT Service_Date, 
        ItemA.CLM_COST_CTR_NBR,   
        ItemA.CLM_RECV_AMT,
        ItemB.CLM_COST_CTR_NBR RES_Cost_Center,
        ItemB.CLM_RECV_AMT,
        GroupCode,
        Service

FROM    DDIS.PTS_MV_CLM_STAT ItemA, 
        DDIS.PTS_MV_CLM_STAT ItemB,
        DDIS.CST_SERV

WHERE   TRUNC(ItemA.CLM_SERV_STRT) between to_date ('01-07-2013','dd-mm-yyyy') and to_date('31-    07-2013','dd-mm-yyyy')
    and TRUNC(ItemA.CLM_SERV_STRT) = TRUNC(ItemB.CLM_SERV_STRT)
    and TRIM(ItemA.CLM_COST_CTR_NBR) = '5P311' 
    and ITEMB.FK_SERV = CST_SERV.PKSERVICE
    and CST_SERV.GroupCode = 'RES'
    and Itema.CLM_SSN = ItemB.CLM_SSN
    and ItemA.CLM_RECV_AMT <> 0
    and ItemB.CLM_RECV_AMT <> 0

ORDER BY ItemA.CLM_SSN, ItemA.CLM_SERV_STRT

1 个答案:

答案 0 :(得分:0)

试试这个,当然替换“A”和“B”值

SELECT CustID, SaleDate, ItemID 
FROM Mview AS mv
WHERE EXISTS(SELECT 1 FROM Mview AS itemA WHERE itemA.ItemID = 'A' 
             AND TRUNC(itemA.SaleDate) = TRUN(mv.SaleDate) )
AND EXISTS(SELECT 1 FROM Mview AS itemB WHERE itemB.ItemID = 'B' 
             AND TRUNC(itemB.SaleDate) = TRUNC(mv.SaleDate) )
AND mv.SaleDate BETWEEN  TO_DATE ('2003/01/07', 'yyyy/mm/dd')
AND TO_DATE ('2003/01/31', 'yyyy/mm/dd');

存在合并确保您当天有卖出那两件商品,日期中的TRUNC是为了摆脱日期的小时和分钟。

介于两者之间时,您可以搜索当前的日期范围,因为您传递的是字符串,所以必须将其转换为日期。

修改 ItemA是没有AS的存在oracle: can you assign an alias to the from clause? sql理解别名内的表Mview的别名,但是如果它让你更容易阅读,你可以把它放在一起。

在您发布的完整示例中,您没有使用DDIS.PTS_MV_CLM_STAT的任何别名,因此,数据库电机不会干扰您所引用的表格,这就是您没有获得所需值的原因。