获取所有没有可用的查询oracle

时间:2014-03-06 14:34:16

标签: sql oracle

我有一个包含这些列代码的表,许可证,许可证类型,日期效果,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

有人在想吗?

1 个答案:

答案 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)