使用以下查询对我来说很有效,只是我只需要为每个 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/