2010-02-23 2 views
1

Скажем, например, У меня есть следующие две таблицы:SQL - XOR на основе ссылок на таблицы

TableA { _id } 
TableB { _id, TableA_id, OptionString } 

Каждая строка в TableA имеет одну или несколько строк в TableB ссылаться на него (с использованием внешнего ключа TableA_id).

В моем запросе перечислены строки в таблице A для отображения пользователю.

OptionString может быть одним из двух значений - допустим, «Option1» и «Option2».

Теперь я хочу, чтобы запрос по-прежнему отображал строки в таблице A, но я хочу предоставить пользователю фильтр, чтобы сказать «только отображать строки в таблице A, где OptionString имеет либо« Option1 », либо« Option2 »(т.е. или).

Я попытался с помощью COUNT, но проблема в том, что нулевой результат показывает ничего не найдено (не «0», как я хочу).

Я уверен, что я должен быть что-то простое отсутствует с этим

Любая помощь была бы принята с благодарностью.

Cheers, Dan.

+0

Пожалуйста, разместите образцы данных и ожидаемых результатов. –

+1

XOR будет «точно одним из вариантов: Option1 или Option2». Чтобы уменьшить путаницу, не могли бы вы написать образцы данных и ожидаемые результаты. – van

ответ

3

Попробуйте это, если я правильно понимаю ваш вопрос

select a._id 
from tableA a 
join tableB b on a._id=b.tableA_id 
where b.optionString in ('Option1','Option2') 
group by a._id 
having count(*)=1 

Пересмотренный запрос на основе новой информации

select a._id 
from tableA a 
join (select distinct _id,tablea_id,optionString from TableB) b 
     on a._id=b.tableA_id 
where b.optionString in ('Option1','Option2') 
group by a._id 
having count(*)=1 

Что я делаю здесь форсирует различные значения от TableB

+0

Если у TableB было 5 Option1 и нет Option2s, ссылающихся на определенную строку в TableA - не будет ли count (*) для этой строки 5, а не 1? – Dan

+0

Если бы это было так, но я не был уверен в вашем примере, что таблица может иметь несколько вхождений шаблона ... Может ли tableb иметь другие значения для опцииString (кроме Option1 и Option2) – Sparky

+0

В настоящее время у нее может быть только Option1 и Option2. Возможно, в будущем может понадобиться другой вариант, но, скорее всего, нет. – Dan

1

Наивный подход (возможно, сможет улучшить это ...)

SELECT * 
FROM TableA 
WHERE _id IN 
    (SELECT TableA_id 
    FROM TableB 
    WHERE OptionString IN ('Option1', 'Option2') 
) 
AND _id NOT IN 
    (SELECT T1.TableA_id 
    FROM TableB T1 
    JOIN TableB T2 ON T1.TableA_id = T2.TableA_id 
    WHERE T1.optionString = 'Option1' 
    AND T2.optionString = 'Option2' 
) 

Идея состоит в том, чтобы просто выбрать квалификационные записи, где находятся Option1 или Option2, и исключить записи, в которых найдены оба варианта Option1 и Option2.

Если мы знаем, что данное значение Optionx может быть найдено только один раз для данного элемента таблицы A, может быть применима группа по запросу (см. Ответ Спарки).

+0

Это похоже на то, что мне нужно. Спасибо за это. – Dan

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