2014-03-06 47 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。非常感謝:)真的幫助了我 –