![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Select ... in (Select ...) [D7, MSSQL]
apl © (2006-05-26 12:28:00)Подскажите
Запрос вида
Select id,.... from Person
where id in (Select id from Person1 where ...)
классно выбирает те записи из Person для которых есть записи в результате выборки из таблицы Person1 сравнивая поле id.
Мне нужно выбрать сразу по 3-м полям. Примерно так:
Select fam,im,ot,... from Person
where fam,im,ot in
(Select fam,im,ot,count(*) from Person
group by fam,im,ot HAVING (count(*)>1))
Такая канструкция - ругается. :(
Это - попытка построить список полных однофамильцев включив каждого однофамильца в результат.
Или как-то можно иначе?
sniknik (2006-05-29 11:39:00) [1]> Почему?
вычисляемое выражение не используются индексы даже если есть, полный скан таблицы, плохой план... тормоза.
и ни одного плюса.
novill (2006-05-29 11:10:00) [2]
> > заменить на конкатенцию строк
>
> не надо так делать
Почему?
evvcom (2006-05-29 08:22:00) [3]
> заменить на конкатенцию строк
не надо так делать
novill (2006-05-26 18:01:00) [4]
> Select fam,im,ot,... from Person
> where fam,im,ot in
> (Select fam,im,ot,count(*) from Person
> group by fam,im,ot HAVING (count(*)>1))
Попробуйте в условии запятые между полями заменить на конкатенцию строк
Select fam,im,ot,... from Person
where fam||im||ot in
(Select fam||im||ot from Person
group by fam,im,ot HAVING (count(*)>1))
Val (2006-05-26 12:43:00) [5]>[5] apl (26.05.06 12:40)
_внимательно_ читаем [2] stone © (26.05.06 12:31), смотрим, что выбирается в select, думаем...
apl (2006-05-26 12:43:00) [6]Спасибо всем
sniknik (2006-05-26 12:42:00) [7]примерно так
Select p.fam,p.im,p.ot,... s.Cnt from Person p
INNER JOIN
(Select fam,im,ot,count(*) AS Cnt from Person
group by fam,im,ot HAVING (count(*)>1)) s
ON p.fam=s.fam AND p.im=s.im AND p.ot=s.ot
Lexer (2006-05-26 12:41:00) [8]а что если пойти по пути объединения:
SELECT P.fam, P.im, P.ot, COUNT(P1.fam) ,....
FROM Person1 P1
LEFT JOIN Person P
ON P.fam = P1.fam,
AND P.im = P1.im,
AND P.ot = P1.ot
GROUP BY P1.fam, P1.im, P1.ot, ...
HAVING (COUNT(P1.fam)>1))
енто непроверенный набросок, за него не отвечаю, но можно посмотреть в этом направлении...
apl (2006-05-26 12:40:00) [9]В результирующую выборку мне нужно включить
КАЖДОГО однофамильма: фамилия, имя, отчество, паспорт, адрес... имя любовницы. а не только сам факт того, кто такието в таком кол-ве.
MsGuns (2006-05-26 12:38:00) [10][3] не считать.
Послал ошибочно ;)
MsGuns (2006-05-26 12:37:00) [11]Select fam,im,ot,count(*) as CNT from Person
group by fam,im,ot
Where CNT>1
Sergey13 (2006-05-26 12:31:00) [12]Можно попорбовать с exists сделать. Правда работать будет скорее всего медленнее.
stone (2006-05-26 12:31:00) [13]типа того
Select fam,im,ot,... from Person p
where exists (Select fam,im,ot,count(*) from Person where fam = p.fam and im = p.im and ot = p.ot
group by fam,im,ot HAVING (count(*)>1))