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

Posted

技术标签:

【中文标题】Oracle SQL 新手需要帮助查找类似记录【英文标题】:Oracle SQL Newbie needs help finding similar records 【发布时间】:2014-02-20 20:58:01 【问题描述】:

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

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

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

知道了!

2/24/2014:嘿,我让它工作了,它在同一行返回结果。对此有一个警告。在我的原始示例中,我正在寻找同时存在 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

【问题讨论】:

@user2989408 查看我在上面发布的代码。它返回时间范围内的所有记录,而不是仅返回 WHERE 语句中的两个值的记录。我仍在努力解决这个问题。任何帮助,将不胜感激。谢谢 【参考方案1】:

试试这个,当然替换'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');

exists 组合确保您当天有这 2 个项目的销售,日期中的 TRUNC 是为了摆脱日期的小时和分钟。

between 让您查找当前日期范围,您必须将其转换为日期,因为您传递的是字符串。

编辑: ItemA是existsoracle: can you assign an alias to the from clause?sql里面的表Mview的别名,不带AS的理解别名,不过如果方便阅读也可以放。

在您发布的完整示例中,您没有为 DDIS.PTS_MV_CLM_STAT 使用任何别名,因此,数据库引擎不会区分您所引用的表,这就是您无法获得所需值的原因。

【讨论】:

@Sr.PEDRO 我还在学习这个 *** 接口,抱歉。请看下面我的回答。我得到了结果,但不是我所期望的。它正在返回该时间范围内的所有记录。 等一下 - 我看到了我的问题。忽略我在下面写的。我正在处理它 - 但必须先去开会......我会解决这个问题的。 [拍脑门……] @ Sr.PEDRO 好的,我知道您使用 Alias 和“AS”的目的。是的,对我(新手)来说,它更容易阅读。在上面的示例中,我会用我的表名替换 Mview,对吗?我已经尝试过这种方式,但在出现“ORA-00933:SQL 命令未正确结束”错误后: FROM DDIS.PTS_MV_CLM_STAT AS mv 您可以给出任何指示吗?感谢所有的帮助。我很接近,我知道.... @ Sr.PEDRO 事实证明,Toad 不喜欢“AS”。我能够正确设置别名。请参见上面的代码。但它在时间范围内返回所有 403K 记录,而不仅仅是具有我输入的两个值的记录。WHERE 语句。但是,这是进步。 我不知道 Toad 不接受 AS,很高兴看到您在没有 AS 的情况下使用别名解决,就像在我的第一个示例中一样。干杯你成功了

以上是关于Oracle SQL 新手需要帮助查找类似记录的主要内容,如果未能解决你的问题,请参考以下文章

oracle SQL中的连续记录

如何在 Oracle 中查找 SQL 查询中返回的记录的内存大小?

Oracle SQL:如何从组中查找记录

需要帮助来优化 ORACLE SQL 查询 [关闭]

查找两个节点之间路径的 Oracle/过程

PL/SQL + Oracle客户端 配置记录