我有一个包含这些列代码的表,许可证,许可证类型,日期效果,expirydate
并且每个代码至少有4种不同的许可类型。我想首先显示至少一个许可类型的expirydate通过当前日期的不可用行。困难的部分是,对于每种许可证类型,我可以更新其expirydate。这是一个带有值的示例表:
2 A 4 1-Jan-2014 1-Jan-2015
2 A 4 1-Jan-2013 1-Jan-2014
2 A 3 1-Jan-2014 1-Jan-2015
2 A 2 1-Jan-2013 9-Jun-2014
2 A 1 1-Jan-2013 10-May-2014
3 B 4 1-Jan-2013 9-Oct-2014
3 B 4 13-Jun-2013 6-Jan-2014
3 B 2 6-Jan-2014 3-Mar-2014
3 B 2 10-Feb-2014 5-Mar-2014
13 C 2 1-Jan-2014 1-Jan-2015
13 C 1 1-Jan-2013 1-Jan-2014
3000115 D 1 1-Jan-2014 1-Jan-2015
3000217 E 3 1-Jan-2012 1-Jan-2013
3000222 F 2 1-Jan-2014 1-Jan-2015
3000222 F 4 1-Jan-2014 1-Jan-2015
3000223 G 2 1-Jan-2011 1-Jan-2012
例如,代码为' 2'在许可证' 4'它已于2014年1月1日到期'但续约至2015年1月1日'。所以整个代码' 2'将不会有任何被认为不可用的字段,因为每个代码的每个许可证类型的所有最后日期都未通过。
所以我想要所有不可用的代码。如果任何许可类型过期,则整个代码将被视为不可用。
我已经开始写这个了,但只有当我知道并且手动传递不是我需要的代码时它才有效:
select distinct code
from licenserevisions
where expirydate<sysdate and code='3' and (select count(code) from licenserevisions where expirydate>sysdate and code='3')=0
预期的输出应该是这样的:
code
3
13
3000217
3000223
有人在想吗?
答案 0 :(得分:0)
不确定你是否看起来像这样
WITH table_name( code, licenseno, licensetype, dateeffective, expirydate) AS (
SELECT 2, 'A', 4, '1-Jan-2014', '1-Jan-2015' from dual union all
SELECT 2, 'A', 4, '1-Jan-2013', '1-Jan-2014' from dual union all
SELECT 2, 'A', 3, '1-Jan-2014', '1-Jan-2015' from dual union all
SELECT 2, 'A', 2, '1-Jan-2013', '9-Jun-2014' from dual union all
SELECT 2, 'A', 1, '1-Jan-2013', '10-May-2014' from dual union all
SELECT 3, 'B', 4, '1-Jan-2013', '9-Oct-2014' from dual union all
SELECT 3, 'B', 4, '13-Jun-2013', '6-Jan-2014' from dual union all
SELECT 3, 'B', 2, '6-Jan-2014', '3-Mar-2014' from dual union all
SELECT 3, 'B', 2, '10-Feb-2014', '5-Mar-2014' from dual union all
SELECT 13, 'C', 2, '1-Jan-2014', '1-Jan-2015' from dual union all
SELECT 13, 'C', 1, '1-Jan-2013', '1-Jan-2014' from dual union all
SELECT 3000115, 'D', 1, '1-Jan-2014', '1-Jan-2015' from dual union all
SELECT 3000217, 'E', 3, '1-Jan-2012', '1-Jan-2013' from dual union all
SELECT 3000222, 'F', 2, '1-Jan-2014', '1-Jan-2015' from dual union all
SELECT 3000222, 'F', 4, '1-Jan-2014', '1-Jan-2015' from dual union all
SELECT 3000223, 'G', 2, '1-Jan-2011', '1-Jan-2012' from dual ),
expired AS (SELECT *
FROM table_name
WHERE expirydate < SYSDATE),
not_expired AS (SELECT *
FROM table_name
WHERE expirydate >= SYSDATE)
SELECT DISTINCT e.code
FROM expired e
WHERE NOT EXISTS( SELECT 'x'
FROM not_expired b
WHERE b.code = e.code
AND b.licensetype = e.licensetype)
输出
| CODE |
|---------|
| 13 |
| 3000217 |
| 3000223 |
| 3 |
因此您的最终查询是
WITH expired AS (SELECT *
FROM table_name
WHERE expirydate < SYSDATE),
not_expired AS (SELECT *
FROM table_name
WHERE expirydate >= SYSDATE)
SELECT DISTINCT e.code
FROM expired e
WHERE NOT EXISTS( SELECT 'x'
FROM not_expired b
WHERE b.code = e.code
AND b.licensetype = e.licensetype)