Eu tenho uma consulta que retorna algo assim:
Name Gender Job date of hire
John M mechanic 2012-05-08
John M electrician 2010-01-01
Vicky F scientific 2012-11-11
Bob M NULL NULL
Eu preciso ter o nome, sexo e nome do trabalho do primeiro emprego de cada pessoa. Mas eu não sei como. Minha consulta está assim:
select name,gender,jobname,hiredate
from person p
left join job j on p.personid = j.personid
Estou no Microsoft SQL Server 2000
Eu preciso disso como resultado:
Name Gender Job
John M electrician
Vicky F scientific
Bob M NULL
Eu deduzo que seus dados são assim:
Tabela de pessoas
Tabela de Trabalho
A primeira tarefa é encontrar o primeiro emprego (por data de contratação) para cada pessoa. Uma maneira legal de fazer isso é usando uma subconsulta correlacionada:
Observe a correlação
WHERE j2.PersonID = j.PersonID
entre as consultas internas e externas. A saída dessa consulta é:O plano de execução (dado um cluster
PRIMARY KEY
emPersonID, HireDate
) é:O interessante desse plano é que a tabela Job só é verificada uma vez, apesar de haver duas referências a ela na consulta original. O plano usa uma otimização que chamo de Segmento Top . Essencialmente, o mecanismo de execução aproveita a ordem do índice para detectar o início de um novo grupo (segmento) e obter apenas a primeira linha de cada grupo (parte superior).
Agora que temos esse resultado, tudo o que precisamos fazer é juntá-lo de volta à tabela Person:
O plano de execução é:
O
OPTION (MERGE JOIN)
não é necessário; Acabei de adicioná-lo para mostrar o plano que você provavelmente obterá quando as tabelas contiverem um número maior de linhas do que neste pequeno exemplo.Definições de tabela e dados de amostra:
Cometi um erro na consulta no comentário. Esqueci o gênero no grupo por. Esta consulta funciona para mim: