2016-02-26 3 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 ║ 
╚════╩══════╩══════╝ 

Я хочу, чтобы применить ограничение уникальности на значение столбца вместо столбца. Таким образом, если данные не содержит Я тогда не повторение, и если она содержит А. Тогда его тонкая Результат набор будет

╔══════╦═══╗ 
║ 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. Это предотвращает дублирование «I» значения в Таблица.

EDIT:

Это происходит со мной, что вы просто хотите результат запроса. Если да, то:

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'; 
Смежные вопросы