2014-03-06 38 views
0

我有这些列码表,licenseno,授权类型,dateeffective,expirydate获取所有无可用查询Oracle

和每个代码至少有4个不同的licensetypes。我想首先显示至少一个许可证类型的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 

因此,例如所述一个与licenseno“4”它已经在“1-JAN-2014”过期,但延长到“1-JAN-2015代码“2” ”。因此,整个代码'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

你可以把预期的输出呢? – San

+0

ive添加了预期的输出并更改了我给你的值m8 –

回答

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) 
+0

yess it m8。非常感谢:)真的帮助了我 –