2013-05-26 2 views
0

Допустим, у меня есть таблица, которая выглядит следующим образом:Исключение строк со связанными значениями

++++++++++++++++++++++++++++++++++++++++ 
    url  | fieldname | value 
++++++++++++++++++++++++++++++++++++++++ 
    a,b,c  | RATE   | 45 
---------------------------------------- 
    a,b,c  | PLAY   | 5 
---------------------------------------- 
    a,b,c  | DATE   | 2013-05-20 
---------------------------------------- 
    d,e,f  | PLAY   | 2 
---------------------------------------- 
    d,e,f  | DATE   | 2013-01-01 
++++++++++++++++++++++++++++++++++++++++ 

Как можно исключить все строки с одним конкретным (! Неизвестным) значением в url колонке, если одна из строк с тем же значением url имеет значение (известное!) в столбце fieldname?

В качестве примера, как бы мне делать, если я хотел, чтобы исключить строки с RATE в fieldname, но и «связанные» строки (те, с тем же значением в url колонке) - так, что он будет возвращать таблицу как это ?:

++++++++++++++++++++++++++++++++++++++++ 
    url  | fieldname | value 
++++++++++++++++++++++++++++++++++++++++ 
    d,e,f  | PLAY   | 2 
---------------------------------------- 
    d,e,f  | DATE   | 2013-01-01 
++++++++++++++++++++++++++++++++++++++++ 

Опять же, имейте в виду, что значение url не должны быть указаны в запросе.

+1

Нет, эти таблицы поступают из базы данных, которая используется в C++-программе (они тоже были изначально SQLite, но мне приходилось мигрировать, потому что интерфейсы SQLite - это дерьмо ..). – user966939

ответ

1

Это пример запроса «sets-in-sets». Мне нравится использовать агрегацию с предложением having, потому что это наиболее общий подход.

Следующий запрос получает URL, вы заинтересованы в:

select url 
from t 
group by url 
having sum(case when fieldname = 'RATE' then 1 else 0 end) = 0; 

Чтобы получить все строки в исходной таблице, вам нужно зарегистрироваться вернуться к нему:

select t.* 
from t join 
    (select url 
     from t 
     group by url 
     having sum(case when fieldname = 'RATE' then 1 else 0 end) = 0 
    ) turl 
    on t.url = turl.url 
+0

Единственное, что удерживало его от работы, было «else 0; end» .... работает, если вы идете с «ELSE 0 END» – Drew

+0

Спасибо, это похоже на работу (второй кодовый блок)! Хотя, мне пришлось сделать небольшую коррекцию: удаление точки с запятой в части «case when». --- РЕДАКТОР, Дрю побил меня. – user966939

Смежные вопросы