Поскольку у вас есть только 2 человека на домохозяйство, вы можете использовать этот трюк, чтобы получить минимальный и максимальный идентификатор клиента на домохозяйство.Это делается в подзапросе.
SELECT
X.HHID,
C1.FIRST_NAME AS I_FIRST_NAME, C1.LAST_NAME AS I_LAST_NAME,
C2.FIRST_NAME AS II_FIRST_NAME, C2.LAST_NAME AS II_LAST_NAME
FROM
(( SELECT
HHID, Min(CID) AS MinCId, IIf(Max(CID)=Min(CID), Null, Max(CID)) AS MaxCId
FROM HouseHold_Client
GROUP BY HHID
) X
INNER JOIN Client AS C1
ON X.MinCId = C1.CID)
LEFT JOIN Client AS C2
ON X.MaxCId = C2.CID;
Цель выражения IIf()
- вывести максимальный идентификатор клиента, только если он отличается от минимального идентификатора клиента.Чтобы также вернуть запись, когда MaxCId
равен Null
, требуется LEFT JOIN
для C2
.
Я не присоединился к таблице HouseHold
здесь, поскольку нам нужен только HHID
из него, который также доступен в HouseHold_Client
.Конечно, вы также можете присоединиться к нему, если вам нужны другие столбцы из него.
Подзапрос:
( SELECT
HHID, Min(CID) AS MinCId, IIf(Max(CID)=Min(CID), Null, Max(CID)) AS MaxCId
FROM HouseHold_Client
GROUP BY HHID
) X
Подзапросы должны быть заключены в круглые скобки и иметь имя (здесьX
).X
действует как обычная таблица со столбцами HHID
, MinCId
и MaxCId
в основном запросе.Он сгруппирован по HHID
.Т.е. он возвращает одну строку за HHID
.Min(CID)
возвращает наименьшее CID
и Max(CID)
наибольшее CID
на HHID
.
В случае, если у вас есть 2 клиента на HHID
, это означает, что Min
и Max
даст эти 2 клиента.Если у вас только 1 клиент, то и Min
, и Max
вернут одного и того же клиента.В этом случае IIf
вернет Null
вместо Max(CID)
, чтобы избежать двойного возврата одного и того же клиента.