You have two options: the first is to restructure the request using joins:
Principle: you need to get the first date for each entry in B, grouped by ID:
SELECT ID, MIN(Date) AS [FirstDate]
FROM B
GROUP BY ID;
You can then attach this back to B to filter the results, i.e.:
SELECT B.*
FROM B
INNER JOIN
( SELECT ID, MIN(Date) AS [FirstDate]
FROM B
GROUP BY ID
) AS B2
ON B2.ID = B.ID
AND B2.FirstDate = B.Date;;
A :
SELECT A.Surname, A.Fornames, A.DOB, B.RegNumber, B.RegDate
FROM (A
INNER JOIN B
ON B.ID = A.ID)
INNER JOIN
( SELECT ID, MIN(Date) AS [FirstDate]
FROM B
GROUP BY ID
) AS B2
ON B2.ID = B.ID
AND B2.FirstDate = B.Date
ORDER BY A.Surname;
JOINs:
SELECT A.Surname, A.Fornames, A.DOB, B.RegNumber, B.RegDate
FROM (A
INNER JOIN B
ON A.ID = B.ID)
LEFT JOIN B AS B2
ON B2.ID = B.ID
AND B2.Date < B.Date
WHERE B2.ID IS NULL
ORDER BY A.Surname;
, B , (B2) , (B), , B2.ID , , B, .
- :
SELECT A.Surname, A.Fornames, A.DOB,
(SELECT TOP 1 B.RegNumber
FROM B
WHERE B.ID=A.ID
ORDER BY B.Date ASC) AS RegNumber
(SELECT TOP 1 B.RegDate
FROM B
WHERE B.ID=A.ID
ORDER BY B.Date ASC) AS RegDate
FROM A
ORDER BY A.Surname;
, , B , JOINs , . , B, , , .