Sql 在子查询中选择多个列

Sql 在子查询中选择多个列,sql,ms-access,Sql,Ms Access,我有一个查询,它从表B中选择最早的记录,表a中每行包含多行,并将其连接到表a: 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 FROM A ORDER BY A.Surname; 这非常有效,但是我还想从表B中提取另一列。因此我将: A.Surname, A.Fornames, A

我有一个查询,它从表B中选择最早的记录,表a中每行包含多行,并将其连接到表a:

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
FROM A
ORDER BY A.Surname;
这非常有效,但是我还想从表B中提取另一列。因此我将:

A.Surname, A.Fornames, A.DOB, B.RegNumber, B.RegDate

如何做到这一点,同时仍然只能从表B中获取最旧的记录?

您有两个选择,第一个是使用联接重新构造查询:

原则是,您需要在
B
中按
ID
分组获得每条记录的第一个日期:

SELECT  ID, MIN(Date) AS [FirstDate]
FROM    B
GROUP BY ID;
然后,您可以将其连接回B,以过滤结果,即:

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;
使用联接的另一种方法是:

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,但是使用连接往往会给优化者提供更好的机会,因此我会转向此方法。另一个优点是它允许您访问
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;
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 min(b.Date)
        FROM B
        WHERE B.ID=A.ID 
       ) AS RegDate
FROM A
ORDER BY A.Surname;
试试这个

SELECT A.Surname, A.Fornames, A.DOB, B.RegNumber, B.RegDate
FROM A
JOIN (
    Select top 1 RegNumber, RegDate
    From B
    WHERE B.ID = A.ID
    Order By B.Date ASC
) B on A.ID = B.ID
ORDER BY A.Surname;
这就是我拼凑一些代码得到的。上面的示例返回一个“id”无法绑定错误。不确定这是否是您正在寻找的,但我尝试了一些示例代码

SELECT A.Surname, A.Fornames, A.DOB, MIN(B.RegNumber) As RegNumber, MIN(B.RegDate) as RegDate
FROM A
JOIN (
    Select ID, RegNumber, RegDate
    From B
) B on A.ID = B.ID
Group By A.Surname, A.Fornames, A.DOB
ORDER BY A.Surname;

子查询无法访问外部查询中的字段。我最近还没有使用access来准确地回忆它将抛出的错误,但它将遵循
A.ID
无法绑定的原则,或者可能只是提示输入一个参数。