![]() |
Модераторы: gambit |
![]() ![]() ![]() |
|
Nord |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 13.8.2007 Репутация: нет Всего: нет |
Приветствую! Встолкнулся вот со следующей проблемой
Имеется таблица: |__id_cat__|_id_key__| | 1 | 5 | | 1 | 2 | | 1 | 3 | | 2 | 1 | | 2 | 2 | | 2 | 3 | | 2 | 4 | Необходимо выбрать только те id_cat, которые имеют уникальную пару из двух id_key Например: нужно отобрать id_cat, у которого id_key=3 и id_key=4 - соответственно это id_cat 2, т.к. id_cat 1 не содержит id_key=4. А для id_key=3 и id_key=5 это будет id_cat 1, т.к. id_cat 2 не содержит id_key=4. Надеюсь, что понятно сформировал вопрос.... Должно как-то просто быть, только вот знаний не хватает запрос составить... |
|||
|
||||
thomas |
|
|||
![]() Доцент... почти ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1385 Регистрация: 3.10.2006 Где: " Сказочное королевство" Репутация: 35 Всего: 65 |
Nord,
Это сообщение отредактировал(а) thomas - 18.8.2007, 10:59 -------------------- Крепко жму горло, искренне ваш Thomas. (С)vingrad Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну! Проблемы негров шерифа не волнуют. |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 15 Всего: 62 |
||||
|
||||
Nord |
|
||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 13.8.2007 Репутация: нет Всего: нет |
Я так уже пробовал - не выводит ничего в результате запроса |
||||
|
|||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 15 Всего: 62 |
Вот запрос, выполняющий поставленную задачу:
, но как-то уж жутко неоптимально. Хотелось бы вот эту часть: 3 IN (SELECT id_key FROM tableName WHERE id_cat = X.id_cat) AND 4 IN (SELECT id_key FROM tableName WHERE id_cat = X.id_cat) переписать вот так: (3, 4) in (SELECT id_key FROM tableName WHERE id_cat = X.id_cat)... однако оператор IN позволяет сравнивать только значение и множество (а в данном случае сравниваются 2 множества). Знатоки SQL, может, подскажете, как этот запрос можно оптимизировать? Это сообщение отредактировал(а) Idsa - 18.8.2007, 18:12 |
|||
|
||||
tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 11 Всего: 170 |
-------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 15 Всего: 62 |
||||
|
||||
andrx |
|
|||
![]() Андрей ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 16.12.2005 Где: Киев Репутация: 1 Всего: 4 |
Можно так :
SELECT * FROM ( SELECT [id_cat] FROM [tableName][T1] GROUP BY [id_cat],[id_key] HAVING ([id_key] IN (3,4)) )[T2] GROUP BY [id_cat] HAVING COUNT(*)>=2 ------------- в конструкции HAVING ([id_key] IN (3,4) - указывай список id_key а в конструкции HAVING COUNT(*)>=2 - указывай количество елементов списка id_key если прислушаться к QA, то этот запрос оптимальнее Доработанный запрос:
Это сообщение отредактировал(а) andrx - 20.8.2007, 12:07 --------------------
Лучше скажи мало, но хорошо. (Козьма Прутков) |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 15 Всего: 62 |
||||
|
||||
andrx |
|
|||
![]() Андрей ![]() Профиль Группа: Участник Сообщений: 109 Регистрация: 16.12.2005 Где: Киев Репутация: 1 Всего: 4 |
Idsa согласен
не сразу понял, что хотел Nord запрос исправлен Добавлено через 8 минут и 7 секунд Idsa
даже если бы это было возможно, я думаю что такая конструкция работала бы через OR, а нужен обязательно AND --------------------
Лучше скажи мало, но хорошо. (Козьма Прутков) |
|||
|
||||
Idsa |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2086 Регистрация: 5.12.2006 Где: Томск Репутация: 15 Всего: 62 |
Оптимальный запрос выглядит вот так:
Его отправил мне по личке топикстартер. Мой вариант использовал коррелированные подзапросы, что делает его гораздо более медленным. Да и вообще, в подобных ситуациях нужно использовать именно inner join. Это сообщение отредактировал(а) Idsa - 20.8.2007, 10:51 |
|||
|
||||
Nord |
|
||||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 13.8.2007 Репутация: нет Всего: нет |
Idsa, спасибо, что разместил здесь это. Вобщем проблема вроде бы как решена ![]() |
||||
|
|||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Базы данных под .NET | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |