T-SQL - Как написать запрос, чтобы получить записи, которые соответствуют ВСЕМ записям в соединении многих ко многим - PullRequest
4 голосов
/ 04 декабря 2009

(я не думаю, что правильно назвал этот вопрос - но я не знаю, как его описать)

Вот что я пытаюсь сделать:

Допустим, у меня есть таблица Person с полем PersonID. И скажем, что человек может принадлежать ко многим группам. Таким образом, существует таблица Group с полем GroupID и таблица GroupMembership, которая является соединением «многие ко многим» между двумя таблицами, а таблица GroupMembership имеет поле PersonID и поле GroupID. Пока это просто присоединение многих ко многим.

Учитывая список идентификаторов групп, я хотел бы иметь возможность написать запрос, который возвращает всех людей, которые находятся во ВСЕХ этих групп (не в одной из этих групп). И запрос должен быть в состоянии обработать любое количество групповых идентификаторов. Я бы хотел избежать динамического SQL.

Есть ли какой-то простой способ сделать это, что мне не хватает? Спасибо, Corey

Ответы [ 3 ]

6 голосов
/ 05 декабря 2009
select person_id, count(*) from groupmembership
where group_id in ([your list of group ids])
group by person_id
having count(*) = [size of your list of group ids]

Отредактировано: спасибо, dotjoe!

0 голосов
/ 05 декабря 2009

По сути, вы не собираетесь избегать «динамического» SQL в смысле динамической генерации запроса во время запроса. Нет никакого способа передать список в SQL (ну, есть переменные таблицы, но получить их в систему из C # невозможно (2005 и ниже) или раздражает (2008)).

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

0 голосов
/ 05 декабря 2009

В основном вы ищете людей, для которых нет группы, членом которой он не является, поэтому

select *
from Person p
where not exists (
    select 1
    from Group g
    where not exists (
        select 1
        from GroupMembership gm
        where gm.PersonID = p.ID
        and gm.GroupID = g.ID
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...