2013-08-18 5 views
1

У меня есть простая таблица m-to-n в базе данных и вам нужно выполнить поиск AND. Таблица выглядит следующим образом:И запросить таблицу m-to-n

column a | column b 
1   x 
1   y 
1   z 
2   x 
2   c 
3   a 
3   b 
3   c 
3   y 
3   z 
4   d 
4   e 
4   f 
5   f 
5   x 
5   y 

Я хочу, чтобы иметь возможность сказать: «дать мне колонку А где она имеет й и у в колонке б (возвращение 1 и 5 здесь), но я не могу понять, как для формирования этого запроса.

Я пробовал SELECT column_a FROM table WHERE column_b = x AND columb_b = y, но кажется, что вернется только в том случае, если столбец был каким-то образом. Является ли это принципиально возможным, или мне нужно иметь разный макет таблицы?

+0

уточняйте тег вашей СУБД –

ответ

1

Вот один из способов:

SELECT a 
FROM Table1 
WHERE b IN ('x', 'y') 
GROUP BY a 
HAVING COUNT(DISTINCT(b)) = 2 

SQL Fiddle

Если вы гарантированно (а, б) является уникальным, вы можете избавиться от DISTINCT, а также.

1

Это пример подзапроса «set-in-sets». Я хотел бы использовать group by и поместить логику в предложении having:

select column_a 
from table 
group by column_a 
having sum(case when column_b = x then 1 else 0 end) > 0 and 
     sum(case when column_b = y then 1 else 0 end) > 0; 

каждой sum() в пункте having рассчитывает количество строк, которые соответствуют одному из условий.

Это оказывается довольно общим. Таким образом, вы можете проверить z просто добавив пункт:

select column_a 
from table 
group by column_a 
having sum(case when column_b = x then 1 else 0 end) > 0 and 
     sum(case when column_b = y then 1 else 0 end) > 0 and 
     sum(case when column_b = z then 1 else 0 end) > 0; 

Или сделать это «х» или «у» с помощью or вместо and:

select column_a 
from table 
group by column_a 
having sum(case when column_b = x then 1 else 0 end) > 0 or 
     sum(case when column_b = y then 1 else 0 end) > 0; 
0

Это принципиально возможное? Да. Самый простой способ понять, почему это было бы, чтобы смотреть на быстрый и грязный раствор, используя INTERSECT:

select a from your_table where b = 'x' 
intersect 
select a from your_table where b = 'y' 

первое условие возвращает 1, 2 и 5; второй возвращает 1, 3 и 5.

Однако на практике лучше использовать группировку, как и в других ответах.