Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.07.30;
Скачать: CL | DM;

Вниз

Select ... in (Select ...)   Найти похожие ветки 

 
apl   (2006-05-26 12:28) [0]

Подскажите
Запрос вида
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))

Такая канструкция - ругается. :(
Это - попытка построить список полных однофамильцев включив каждого однофамильца в результат.
Или как-то можно иначе?


 
Sergey13 ©   (2006-05-26 12:31) [1]

Можно попорбовать с exists сделать. Правда работать будет скорее всего медленнее.


 
stone ©   (2006-05-26 12:31) [2]

типа того

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


 
MsGuns ©   (2006-05-26 12:37) [3]

Select fam,im,ot,count(*) as CNT from Person
   group by fam,im,ot
   Where CNT>1


 
MsGuns ©   (2006-05-26 12:38) [4]

[3] не считать.
Послал ошибочно ;)


 
apl   (2006-05-26 12:40) [5]

В результирующую выборку мне нужно включить
КАЖДОГО однофамильма: фамилия, имя, отчество, паспорт, адрес... имя любовницы. а не только сам факт того, кто такието в таком кол-ве.


 
Lexer ©   (2006-05-26 12:41) [6]

а что если пойти по пути объединения:
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))

енто непроверенный набросок, за него не отвечаю, но можно посмотреть в этом направлении...


 
sniknik ©   (2006-05-26 12:42) [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


 
Val ©   (2006-05-26 12:43) [8]

>[5] apl   (26.05.06 12:40)
_внимательно_ читаем  [2] stone ©   (26.05.06 12:31), смотрим, что выбирается в select, думаем...


 
apl   (2006-05-26 12:43) [9]

Спасибо всем


 
novill ©   (2006-05-26 18:01) [10]


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


 
evvcom ©   (2006-05-29 08:22) [11]


> заменить на конкатенцию строк

не надо так делать


 
novill ©   (2006-05-29 11:10) [12]


> > заменить на конкатенцию строк
>
> не надо так делать

Почему?


 
sniknik ©   (2006-05-29 11:39) [13]

> Почему?
вычисляемое выражение не используются индексы даже если есть, полный скан таблицы, плохой план... тормоза.
и ни одного плюса.



Страницы: 1 вся ветка

Текущий архив: 2006.07.30;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.027 c
2-1152525664
zdm
2006-07-10 14:01
2006.07.30
PageControl


3-1148558746
atruhin
2006-05-25 16:05
2006.07.30
динамическое создание процедур в FB


15-1151779418
Некто
2006-07-01 22:43
2006.07.30
Как красиво дарить цветы?


2-1152461297
J_SABER
2006-07-09 20:08
2006.07.30
поле key в valuelisteditor


2-1152480645
PhillipJFry
2006-07-10 01:30
2006.07.30
Помогите с запросом!!