Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
1

Поиск совпадения в группе

16.07.2014, 11:34. Просмотров 519. Ответов 16
Метки нет (Все метки)

есть три таблицы examle1 example2 examle3 соответственно.

examle1 содержит
subID | objID | rcpID

examle2 содержит
objID | OID | ...

(связь с example 1 через objID один ко многим)

examle3 содержит
subID | lawID |..

(связь с example 2 через OID - lawID один ко многим )

мне необходимы все rcpID у которых subID не содержится в группе и подгруппе образованными example2 и example3 для соответствующего objID

те грубо говоря берем subID из первой таблицы и смотрим есть ли он в группе записей из 3 таблицы, если нет то выводим rpcID
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.07.2014, 11:34
Ответы с готовыми решениями:

Как можно получить % совпадения строк?
Допустим есть 2 поля: Карова и Корова , как узнать % их похожести?...

Нормализация бд доступа пользователей к группе
нужно привести бд в 1 нф В таблице есть поля код доступа пользователя к...

Нумерация групп и записей в группе.
Добрый день, уважаемые мастера T-SQL программирования! Буду премного...

Вывести кураторов, у которых более 2 отличников в группе
Задача: Вывести кураторов у которых более 2 отличников в группе. Данный запрос...

Сгруппировать записи по оператору и узнать количество в каждой группе
Добрый день. Прошу немного вашей мудрости))) Просто столкнулся с такой...

16
invm
1886 / 1277 / 381
Регистрация: 02.06.2013
Сообщений: 3,223
16.07.2014, 12:42 2
not exists с кореллированным подзапросом внутри.
0
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
16.07.2014, 14:08  [ТС] 3
получается 2 подзапроса ?
0
invm
1886 / 1277 / 381
Регистрация: 02.06.2013
Сообщений: 3,223
16.07.2014, 14:16 4
Почему два? Один.
0
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
16.07.2014, 14:30  [ТС] 5
T-SQL
1
2
3
select rcpID from 
examle1 a, examle2 b, examle3 c
where a.objID = b.objID and b.oid = c.lawID and a.subID <> c.subID
так выведет не учитывая группы, а как использовать подзапрос в том случае?
0
invm
1886 / 1277 / 381
Регистрация: 02.06.2013
Сообщений: 3,223
16.07.2014, 14:52 6
T-SQL
1
2
3
4
5
6
select
 a.rcpID
from 
 examle1 a
where
 not exists(select 1 from examle2 b join examle3 c on b.oid = c.lawID where b.objID = a.objID and a.subID = c.subID);
0
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
16.07.2014, 15:00  [ТС] 7
а для чего нужен select 1
0
iap
888 / 616 / 127
Регистрация: 27.11.2009
Сообщений: 1,829
16.07.2014, 15:06 8
Цитата Сообщение от fromdd Посмотреть сообщение
а для чего нужен select 1
Правильный вопрос!
Я бы написал SELECT *
0
invm
1886 / 1277 / 381
Регистрация: 02.06.2013
Сообщений: 3,223
16.07.2014, 15:39 9
Цитата Сообщение от fromdd Посмотреть сообщение
а для чего нужен select 1
В качестве select-листа в exists можно указывать любые синтаксически верные выражения, кроме содержащих несуществующие столбцы - они все равно не будут вычислены. Можете вместо 1 написать 1/0: на результат это не повлияет.
0
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
18.07.2014, 14:38  [ТС] 10
в таблице example2 есть поле objkindId, которое принимает допустим 7 различных значений, мне надо выбрать все записи с определенным objkindId, допустим равным 7, для этого я в условии дописываю b.objkindId <> '7' вот так
T-SQL
1
2
3
4
5
6
select
 a.rcpID
from 
 examle1 a
where
 not exists(select 1 from examle2 b join examle3 c on b.oid = c.lawID where b.objID = a.objID and a.subID = c.subID and b.objkindId <> '7');
в результате получаю записи которые не подходят по условиям b.objID = a.objID and a.subID = c.subID , в чем может быть дело ?

Добавлено через 22 часа 57 минут
Цитата Сообщение от fromdd Посмотреть сообщение
where a.objID = b.objID and b.oid = c.lawID and a.subID <> c.subID
Цитата Сообщение от invm Посмотреть сообщение
where
*not exists(select 1 from examle2 b join examle3 c on b.oid = c.lawID where b.objID = a.objID and a.subID = c.subID);
а почему вы при использовании not exists неравенство a.subID <> c.subID заменили на равенство, а равенство оставили без изменения??
0
invm
1886 / 1277 / 381
Регистрация: 02.06.2013
Сообщений: 3,223
18.07.2014, 15:23 11
Цитата Сообщение от fromdd Посмотреть сообщение
а почему вы при использовании not exists неравенство a.subID <> c.subID заменили на равенство, а равенство оставили без изменения??
Потому что not exists, т.е. проверяется ваше же условие: "мне необходимы все rcpID у которых subID не содержится в группе и подгруппе образованными example2 и example3 для соответствующего objID"
Попробуйте выполнить и поймете:
T-SQL
1
2
3
4
5
select
 a.rcpID,
 case when exists(select 1 from examle2 b join examle3 c on b.oid = c.lawID where b.objID = a.objID and a.subID = c.subID) then 1 else 0 end
from 
 examle1 a;
0
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
18.07.2014, 15:34  [ТС] 12
Цитата Сообщение от invm Посмотреть сообщение
on b.oid = c.lawID where b.objID = a.objID and a.subID = c.subID
я вот про это условие b.objID = a.objID, разве его не надо заменить на b.objID <> a.objID для использования в not exists ??
0
invm
1886 / 1277 / 381
Регистрация: 02.06.2013
Сообщений: 3,223
18.07.2014, 16:07 13
Цитата Сообщение от fromdd Посмотреть сообщение
разве его не надо заменить на b.objID <> a.objID для использования в not exists ??
Предикат b.objID = a.objID обеспечивает "для соответствующего objID" из вашей постановки задачи.
0
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
18.07.2014, 16:21  [ТС] 14
Цитата Сообщение от invm Посмотреть сообщение
Предикат b.objID = a.objID обеспечивает "для соответствующего objID" из вашей постановки задачи.
но если он будет стоять в not exist, то в результате запроса будут все те в которых b.objID <> a.objID или я не правильно понимаю?
0
invm
1886 / 1277 / 381
Регистрация: 02.06.2013
Сообщений: 3,223
18.07.2014, 16:55 15
fromdd, кореллированный подзапрос
T-SQL
1
select 1 from examle2 b join examle3 c on b.oid = c.lawID where b.objID = a.objID
вернет все строки из example3, относящиеся по objID к строке из example1. Добавив к нему фильтр a.subID = c.subID, получим все строки из example3, относящиеся по objID к строке из example1 и совпадающие по subID. Чтобы выполнилось условие задачи, этот запрос должен возвратить пустой набор. Что и сделано путем заключения его в not exists().
0
fromdd
3 / 3 / 0
Регистрация: 19.03.2011
Сообщений: 311
18.07.2014, 17:26  [ТС] 16
так он у вас неправильно работает, допустим есть в первой таблице subID и objID и по этому objID есть несколько записей в объединенной таблице example2 и elample 3, у каждой из этих записей есть в свою очередь несколько subID, и запрос
Цитата Сообщение от invm Посмотреть сообщение
select
*a.rcpID,
*case when exists(select 1 from examle2 b join examle3 c on b.oid = c.lawID where b.objID = a.objID and a.subID = c.subID) then 1 else 0 end
from
*examle1 a;
вернет верный результат только в том случае если subID будет равен множеству subID из объединения examle2 и example 3 у которых один objID
0
invm
1886 / 1277 / 381
Регистрация: 02.06.2013
Сообщений: 3,223
18.07.2014, 17:38 17
fromdd, вы просто не можете понять как работает exists()...

Добавлено через 5 минут
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
declare @e1 table (subID int, objID int, rcpID int);
declare @e2 table (objID int, OID int);
declare @e3 table (subID int, lawID int);
 
insert into @e1
values
 (1, 1, 1), (2, 2, 2);
 
insert into @e2
values
 (1, 1), (2, 2);
 
insert into @e3
values
 (1, 1), (3, 2), (4, 2);
 
select
 a.rcpID
from 
 @e1 a
where
 not exists(select 1 from @e2 b join @e3 c on b.oid = c.lawID where b.objID = a.objID and a.subID = c.subID);
0
18.07.2014, 17:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
18.07.2014, 17:38

Поиск совпадения строк
Привет. Подскажите чайнику как зациклить парочку процедур. Программа загружает...

Поиск частичного совпадения в Excel
Доброе время суток, есть код для поиска значения в exele Dim App As New...

ADOTable поиск частичного совпадения
Есть поиск по точному совпадению вот код if (RadioGroup1-&gt;ItemIndex == -1) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru