Выберите ID, учитывая список участников - PullRequest
0 голосов
/ 06 октября 2011

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

APP_ID | GROUP_ID | CUSTOMER_ID
1      |     1    |    123
1      |     1    |    124
1      |     1    |    125
1      |     2    |    123
1      |     2    |    125
2      |     3    |    123
3      |     1    |    123
3      |     1    |    124
3      |     1    |    125

Теперь у меня есть потребность, учитывая список идентификаторов клиентов, чтобы можно было получить идентификатор группы для этого списка идентификаторов клиентов.Идентификатор группы может быть не уникальным, один и тот же идентификатор группы будет содержать один и тот же список идентификаторов клиентов, но эта группа может существовать в нескольких app_id.

Я думаю, что

SELECT APP_ID, GROUP_ID, COUNT(CUSTOMER_ID) AS COUNT
FROM GROUP_CUST_REL 
WHERE CUSTOMER_ID IN ( <list of ids> )
GROUP BY APP_ID, GROUP_ID
HAVING COUNT(CUSTOMER_ID) = <number of ids in list>

вернет мне все идентификаторы групп, которые содержат все идентификаторы клиентов в данном списке и только эти идентификаторы групп.Таким образом, для списка (123,125) из приведенного выше примера будет возвращен только идентификатор группы 2

Затем мне нужно будет связаться с таблицей приложения, чтобы использовать созданную временную метку для определения самого последнего приложения, в котором существовала группа.чтобы я мог получить правильную / самую актуальную информацию из таблицы групп.

Есть ли у кого-нибудь мысли о том, является ли это наиболее эффективным способом сделать это?Если есть другой способ быстрее / чище, я буду признателен за ваши мысли.

1 Ответ

2 голосов
/ 06 октября 2011

Пахнет как деление:

Образец деления

Другой вопрос переполнения стека

Взгляните наПо предоставленным ссылкам вы увидите решение схожих проблем с точки зрения реляционной алгебры, которое не кажется более быстрым и возможно более чистым.

Сначала я не смотрел на ваше решение, а когдаЯ решил, что решил это так же, как вы.

На самом деле, я подумал:

<number of ids in list>

Может быть превращено во что-то подобное (чтобы вы ненужен дополнительный параметр):

select count(*) from (<list of ids>) as t 

Но ясно, что я ошибся.Я бы остался с вашим текущим решением на вашем месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...