2014-09-09 4 views
0

Allright поэтому я этот запрос, который в значительной степени подтягивания всей информации я получил в моей БДПоказывать только несколько экземпляров

Select 
p.ProjectName, 
s.siteid, 
c.PaperID, 
m.MemberFirstName, 
m.MemberLastName, 
m.MemberDOB, 
m.MemberID 
From Sites s, Papers c, Members m, Projects p 
Where s.SiteID=c.SiteID 
and c.MemberID=m.MemberID 
and s.ProjectID=p.ProjectID 
order by ProjectName, MemberFirstName, MemberLastName 

Однако, я просто хочу, чтобы грушевидным вниз мой запрос для отображения только несколько экземпляров когда Участник входит на несколько сайтов

В настоящее время мои результаты выглядят примерно так: результат в этом конкретном случае я хочу сохранить результаты Джона Доу, потому что он появляется на нескольких сайтах (его MemberID проверяет, что он тот же Джон Доу, а не другой Джон Доу), но я не хочу оставлять результаты Джейн Доу, потому что она появляется только один раз на одном жет.

ProjectName | SiteID | PaperId | MemberFirstName | MemberLastName | MemberDOB | MemberID 
------------------------------------------------------------------------------------------- 
Project 1 | 123456 | 123  | Jane    | Doe   | 1991-01-01 | 12345 
------------------------------------------------------------------------------------------- 
Project 1 | 789012 | 321  | John    | Doe   | 1991-02-02 | 54321 
------------------------------------------------------------------------------------------- 
Project 1 | 345678 | 456  | John    | Doe   | 1991-02-02 | 54321 
+0

Должен ли Джон Доу появляется дважды или только один раз в вашем примере? –

+0

Yep - он должен появляться дважды – StayPuft

ответ

0

Или, если имеющий SiteID важно, чтобы вы могли сделать что-то вроде:

SELECT 
ProjectName, 
siteid, 
PaperID, 
MemberFirstName, 
MemberLastName, 
MemberDOB, 
MemberID 
FROM (
    Select 
    p.ProjectName, 
    s.siteid, 
    c.PaperID, 
    m.MemberFirstName, 
    m.MemberLastName, 
    m.MemberDOB, 
    m.MemberID, 
    COUNT(1) OVER (PARTITION BY m.MemberID) AS CNT 
    From Sites s, Papers c, Members m, Projects p 
    Where s.SiteID=c.SiteID 
    and c.MemberID=m.MemberID 
    and s.ProjectID=p.ProjectID 
    ) A 
WHERE CNT > 1 
order by ProjectName, MemberFirstName, MemberLastName 
+0

Хотелось бы оставить SiteID, ChartID и ProjectName - однако запуск этого запроса выглядит так, как будто он по-прежнему дает мне те же результаты, когда появляются члены, которые появляются только один раз на одном сайте. – StayPuft

+0

Я получаю правильные результаты, когда я издеваюсь над этим в sqlfiddle. http://sqlfiddle.com/#!6/27092/2 Глядя на это снова, я бы использовал m.MemberID в предложении PARTITION BY вместо M.MemberFirstName и m.MemberLastName. –

+0

О нет, ты прав! Спасибо за помощь! – StayPuft

0

То, что вы хотите это GROUP BY и HAVING. Обратите внимание, что вы не сможете выбрать одни и те же данные, так как будет несколько SiteID с человека.

Что-то вроде этого:

Select 
    m.MemberFirstName, 
    m.MemberLastName, 
    m.MemberDOB, 
    m.MemberID 
From Sites s, Papers c, Members m, Projects p 
Where s.SiteID = c.SiteID 
    and c.MemberID = m.MemberID 
    and s.ProjectID = p.ProjectID 
order by ProjectName, MemberFirstName, MemberLastName 
GROUP BY 
    m.MemberFirstName, 
    m.MemberLastName, 
    m.MemberDOB, 
    m.MemberID 
HAVING COUNT(*) > 1 
Смежные вопросы