Если ваш текущий запрос в порядке, вы можете использовать COUNT(*) OVER(PARTITION BY p.person_id) AS noOfRows
, чтобы определить, сколько строк сгенерирует запрос, затем select
только записи с одной строкой и запросом вдоль этих строк:
WITH myCte AS (
SELECT
p.Last_Name
,p.First_Name
,p.Middle_Initial
,p.person_id
,i.Document
,i.Expiration_date
,i.Updated_Date
,i.IssueDate
,i.Historical
,i.Comments
,f.Current_status
,i.State as DocumentState
,COUNT(*) OVER(PARTITION BY p.person_id) AS noOfRows
from dbo.PersonDoc_ID_Numbers i
inner join "DB"."dbo"."People" p on p.person_id = i.person_id
left join person_facilities f on p.person_id = f.person_id
where
(Document like '%limited%' and i.State like '%NY%' and ((i.Expiration_date > getdate()) or (i.Expiration_date is null))) or
(Document like '%NY%' and i.State like '%NY%' and ((i.Expiration_date > getdate()) or (i.Expiration_date is null)))
and f.current_status in ('Active')
and i.Historical != 1
)
SELECT Last_Name
,First_Name
,Middle_Initial
,person_id
,Document
,Expiration_date
,Updated_Date
,IssueDate
,Historical
,Comments
,Current_status
,DocumentState
FROM myCte
WHERE noOfRows = 1
AND Document like '%limited%'
Вот упрощенный пример этого на работе: SQLFiddle
EDIT:
Учитывая предоставленные вами примеры данных, вот мое предлагаемое решение:
WITH myCte AS (
SELECT
p.Last,
p.First,
p.person_id,
i.Document,
i.Expiration_date,
i.Updated_Date,
i.Historical,
f.Current_status,
i.State as DocumentState,
COUNT(*) OVER(PARTITION BY p.person_id) AS noOfRows
FROM dbo.PersonDoc_ID_Numbers i
JOIN dbo.Person p ON p.person_id = i.person_id
JOIN person_facilities f ON p.person_id = f.person_id
WHERE
(Document like '%limited%' AND i.State like '%NY%' AND ((i.Expiration_date > getdate()) OR (i.Expiration_date is null))) or
(Document like '%NY%' AND i.State like '%NY%' AND ((i.Expiration_date > getdate()) OR (i.Expiration_date is null)))
AND f.current_status in ('Active')
AND i.Historical != 1
)
SELECT Last
,First
,person_id
,Document
,Expiration_date
,Updated_Date
,Historical
,Current_status
,DocumentState
FROM myCte
WHERE noOfRows = 1
AND Document like '%limited%'
Вот новый пример с использованием предоставленных данных: SQLFiddle