2016-02-26 173 views
0

我有這個表:唯一約束值

╔════╦══════╦══════╗ 
║ ID ║ Test ║ DATA ║ 
╠════╬══════╬══════╣ 
║ 1 ║ Q ║ I ║ 
║ 2 ║ Q ║ I ║ 
║ 3 ║ Q ║ A ║ 
║ 4 ║ Q ║ A ║ 
║ 5 ║ Q ║ A ║ 
║ 6 ║ X ║ A ║ 
║ 7 ║ X ║ A ║ 
║ 8 ║ Z ║ I ║ 
║ 9 ║ Z ║ I ║ 
╚════╩══════╩══════╝ 

我想在列值,而不是列應用唯一的約束。所以,如果數據包含了我再沒有重複,如果它包含A,然後以其優良的 結果集將

╔══════╦═══╗ 
║ Test ║ D ║ 
╠══════╬═══╣ 
║ Q ║ I ║ 
║ Q ║ A ║ 
║ Q ║ A ║ 
║ Q ║ A ║ 
║ X ║ A ║ 
║ X ║ A ║ 
║ Z ║ I ║ 
╚══════╩═══╝ 

是否有可能?

回答

0

Oracle不支持過濾索引,但你可以做基本上是相同的認爲使用表達式:

create unique index idx_t_test_id 
    on t(test, (case when data = 'I' then 0 else id end)); 

這假定id是獨一無二的,永遠爲0。這可以防止重複在「我」的價值觀表。

編輯:

它發生在我身上,你只是想查詢結果。如果是這樣的話:

select test, data 
from (select t.*, 
      row_number(*) over (partition by test, data order by id) as cnt 
     from t 
    ) t 
where cnt = 1 or data <> 'I';