Sql 在子查询中选择多个列
我有一个查询,它从表B中选择最早的记录,表a中每行包含多行,并将其连接到表a: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
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
无法绑定的原则,或者可能只是提示输入一个参数。