Oracle SQL : Return a set without duplicates

标签 oracle

使用以下查询对我来说很有效,只是我只需要为每个 TPHONE.ID 返回一个结果。

我想要完成的是检查两个表中的三个日期字段(两个在 TPHONE 表中,一个在 TPHONEREQUEST 表中,并返回 TPHONE.ID 我在特定范围内找到日期的任何地方。但是,如果任一表中的多个条目具有该日期范围内的一个或多个日期,我仍然只想返回TPHONE.ID一次。

SELECT 
   TPHONE.ID,
   TPHONE.LOCATIONID,
   TPHONE.DLASTCHANGED,
   TPHONE.D02,
   TPHONEREQUEST.D03
FROM
   TPHONE, TPHONEREQUEST
WHERE
   TPHONE.ID = TPHONEREQUEST.DEVICEID
   AND TPHONE.ID IN
   (
   SELECT
      TPHONE.ID
   FROM
      TPHONE
   WHERE
      TPHONE.DLASTCHANGED >= '7/1/2019' AND TPHONE.DLASTCHANGED < '10/1/2019'
      OR TPHONE.D02 >= '7/1/2019' AND TPHONE.D02 < '10/1/2019'
      OR TPHONEREQUEST.D03 >= '7/1/2019' AND TPHONEREQUEST.D03 < '10/1/2019'
   )
ORDER BY
   TPHONE.LOCATIONID, TPHONE.ID

最佳答案

您可以将聚合和过滤与 HAVING 子句结合使用:

SELECT p.ID,
FROM
    TPHONE p
    INNER JOIN TPHONEREQUEST t ON p.ID = r.DEVICEID
GROUP BY p.ID
HAVING
    MAX(
        CASE WHEN 
            (
                p.DLASTCHANGED >= TO_DATE('07/01/2019', 'DD/MM/YYYY') 
                AND p.DLASTCHANGED < TO_DATE('10/1/2019', 'DD/MM/YYYY')
            ) OR (
                p.D02 >= TO_DATE('07/01/2019', 'DD/MM/YYYY') 
                AND p.D02 < TO_DATE('10/1/2019', 'DD/MM/YYYY')
            ) OR (
                r.D03 >= TO_DATE('07/01/2019', 'DD/MM/YYYY') 
                AND r.D03 < TO_DATE('10/1/2019', 'DD/MM/YYYY')
            )
        THEN 1
        END
    ) = 1

注释:

  • 这仅返回TPHONE.ID,因为这似乎就是您正在寻找的内容;如果您想要更多列,则可以将它们添加到 SELECT 子句和 GROUP BY 子句(请注意,如果这些列是功能上不依赖于TPHONE.ID)

  • 我使用表别名来缩短查询

  • 我使用 TO_DATE() 生成正确的日期,而不是依赖数据库的默认格式(可能会因数据库和 session 而异)。这里假设您的日期格式为DD/MM/YYYY(也可能是MM/DD/YYYY)

关于Oracle SQL : Return a set without duplicates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58806124/

相关文章:

oracle - 向现有表添加新列的效果

sql - 甲骨文 SQL : Merge rows into single row

oracle - 在另一个架构上创建表

java - Oracle获取插入记录的ID

mysql - 如何在sql中使用范围获取价格范围?

php - 无法让 dbms_output 在 PHP 中工作(连接到 Oracle 数据库)

mysql - 如何将简单的 SQL 请求转换为 Apache PIG 脚本?

mysql - 从数据库中检索每个用户的倒数第二条记录

sql - 循环遍历 Oracle 中的显式游标

通过转换表匹配的 SQL 模式