[MS SQL] exists vs join

0

Cześć,

potrzebuję wyciągnąć osoby które w danym przedziale czasowym zmieniły firmę. Id firmy jest w karcie dostępu przypisanej do użytkownika. [AccessCard].[company_companyID]. Napisałem query używając 'exists', ale tu jest taki problem że wyników podzapytania w 'exists', nie mogę wyświetlić. Zatem zrobiłem to używając join. Zdziwiło mnie bo wg mnie wyniki powinny być takie same. Ale tak nie jest. Uwaga jedna osoba może mieć przypisaną jedną kartę w danym momencie. Jednak w zadanym okresie czasu mogła kilka razy zmieniać firmę, zastanawiam się jak wylistować wszystkie firmy dla danej osoby jeśli jest ich więcej niż 1 w danym przedziale czasowym

  select 
  p.PersonID, p.lastName, p.firstName, p.jobPosition, p.birthDate, 
  ac.CardID, ac.lastPrintDate, ac.company_CompanyID
  from 
  [Person] p
  join [AccessCard] ac on p.PersonID = ac.person_PersonID
  where 
   ac.lastPrintDate between '2015-01-06' and getdate()
   and exists (
	  select ac2.company_CompanyID from [AccessCard] ac2 
	  where ac2.person_PersonID = ac.person_PersonID 
	  and ac2.lastPrintDate between '2015-01-06' and getdate()
	  and ac.company_CompanyID <> ac2.company_CompanyID 
   ) 

   
  select 
  p.PersonID, p.lastName, p.firstName, p.jobPosition, p.birthDate, 
  ac.CardID as [CardId1], ac.lastPrintDate as [PrintDate1], ac.[company_CompanyID] as [Company1], ac2.CardID as [CardId2], ac2.lastPrintDate as [PrintDate2], ac2.[company_CompanyID] as [Company2]  
  from 
  [Person] p
  join [AccessCard] ac 
    on p.PersonID = ac.person_PersonID 
    and ac.lastPrintDate between '2015-01-06' and getdate()
  join [AccessCard] ac2 
    on ac2.person_PersonID = ac.person_PersonID 
    and ac2.lastPrintDate between '2015-01-06' and getdate()  
    and ac.company_CompanyID <> ac2.company_CompanyID 

0

mam inny pomysł

SELECT
	osobyfirmy.osoba
FROM
(
select 
	 p.PersonID as osoba
	,ac.company_CompanyID
from 
	[Person] p
	join [AccessCard] ac on p.PersonID = ac.person_PersonID
where 
   ac.lastPrintDate between '2015-01-06' and getdate()
group by
	1,2
)as osobyfirmy
GROUP BY
	1
HAVING
	COUNT(*)>2

w wyniku tego zapytania otrzymujesz ID-ki osób które w zadanym okresie "zmieniły" firmę. później do ID-ków dołącz sobie resztę danych.

1 użytkowników online, w tym zalogowanych: 0, gości: 1