Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Выборка из таблицы уникального значения, Как составить запрос 
V
    Опции темы
Nord
Дата 18.8.2007, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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.

Надеюсь, что понятно сформировал вопрос....
Должно как-то просто быть, только вот знаний не хватает запрос составить...
PM MAIL   Вверх
thomas
Дата 18.8.2007, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

Репутация: 35
Всего: 65



Nord
Код

SELECT id_cat FROM tableName WHERE id_key = 3 AND id_key = 4;


Это сообщение отредактировал(а) thomas - 18.8.2007, 10:59


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Idsa
Дата 18.8.2007, 11:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(thomas @  18.8.2007,  10:58 Найти цитируемый пост)
SELECT id_cat FROM tableName WHERE id_key = 3 AND id_key = 4;

smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Nord
Дата 18.8.2007, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 13.8.2007

Репутация: нет
Всего: нет



Цитата(thomas @ 18.8.2007,  10:58)
Nord
Код

SELECT id_cat FROM tableName WHERE id_key = 3 AND id_key = 4;

Я так уже пробовал - не выводит ничего в результате запроса
PM MAIL   Вверх
Idsa
Дата 18.8.2007, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Вот запрос, выполняющий поставленную задачу:
Код

SELECT distinct id_cat FROM tableName AS X WHERE 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 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


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
tol05
Дата 18.8.2007, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

Репутация: 11
Всего: 170



Код

SELECT id_cat FROM tableName WHERE id_key = 3 OR id_key = 4



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Idsa
Дата 18.8.2007, 18:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(Nord @  18.8.2007,  10:32 Найти цитируемый пост)
Необходимо выбрать только те id_cat, которые имеют уникальную пару из двух id_key

Цитата(tol05 @  18.8.2007,  18:34 Найти цитируемый пост)
SELECT id_cat FROM tableName WHERE id_key = 3 OR id_key = 4

smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
andrx
Дата 20.8.2007, 09:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Андрей
*


Профиль
Группа: Участник
Сообщений: 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, то этот запрос оптимальнее


Доработанный запрос:
Код

SELECT [id_cat] FROM [tableName] WHERE ([id_key] IN (3,4)) GROUP BY [id_cat] HAVING COUNT(*)>=2


Это сообщение отредактировал(а) andrx - 20.8.2007, 12:07
--------------------
Лучше скажи мало, но хорошо. (Козьма Прутков)
PM MAIL ICQ   Вверх
Idsa
Дата 20.8.2007, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Цитата(andrx @  20.8.2007,  09:12 Найти цитируемый пост)
SELECT [id_cat] FROM [tableName] WHERE (id_key IN (3,4)) 

Тоже smile


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
andrx
Дата 20.8.2007, 09:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Андрей
*


Профиль
Группа: Участник
Сообщений: 109
Регистрация: 16.12.2005
Где: Киев

Репутация: 1
Всего: 4



Idsa  согласен
не сразу понял, что хотел Nord 

запрос исправлен

Добавлено через 8 минут и 7 секунд
Idsa
Цитата

переписать вот так: (3, 4) in (SELECT id_key FROM tableName WHERE id_cat = X.id_cat)


даже если бы это было возможно, я думаю что такая конструкция работала бы через OR, а нужен обязательно AND
--------------------
Лучше скажи мало, но хорошо. (Козьма Прутков)
PM MAIL ICQ   Вверх
Idsa
Дата 20.8.2007, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2086
Регистрация: 5.12.2006
Где: Томск

Репутация: 15
Всего: 62



Оптимальный запрос выглядит вот так:
Код

select t1.id_cat from 

    ( select * from [table] where id_key = 3 ) as t1

    inner join

    ( select * from [table] where id_key = 4 ) as t2

    on t1.id_cat = t2.id_cat

Его отправил мне по личке топикстартер.

Мой вариант использовал коррелированные подзапросы, что делает его гораздо более медленным. Да и вообще, в подобных ситуациях нужно использовать именно inner join.

Это сообщение отредактировал(а) Idsa - 20.8.2007, 10:51


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Nord
Дата 22.8.2007, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 5
Регистрация: 13.8.2007

Репутация: нет
Всего: нет



Цитата(Idsa @ 20.8.2007,  10:45)
Оптимальный запрос выглядит вот так:
Код

select t1.id_cat from 

    ( select * from [table] where id_key = 3 ) as t1

    inner join

    ( select * from [table] where id_key = 4 ) as t2

    on t1.id_cat = t2.id_cat

Его отправил мне по личке топикстартер.

Мой вариант использовал коррелированные подзапросы, что делает его гораздо более медленным. Да и вообще, в подобных ситуациях нужно использовать именно inner join.

Idsa, спасибо, что разместил здесь это. Вобщем проблема вроде бы как решена  smile  
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
stab
mr.DUDA
Exception

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, stab, mr.DUDA, Exception.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Базы данных под .NET | Следующая тема »


 




[ Время генерации скрипта: 0.1144 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.