Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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))


Наверх

Титульная страница Поиск, карта сайта Написать письмо