使用SQL从Access数据库中选择记录对
我正在尝试使用Excel VBA和SQL语句从access数据库中提取记录。 使用Excel VBA和SQL SELECT语句,我可以使用WHERE子句提取记录。 现在我正在尝试从数据库中选择成对的记录,但我不确定如何实现这一点 访问表:(注意:表中还有其他列) 我想根据姓名选择配对 例如 然后我想根据第一个DTE进行过滤/选择使用SQL从Access数据库中选择记录对,sql,excel,vba,ms-access,Sql,Excel,Vba,Ms Access,我正在尝试使用Excel VBA和SQL语句从access数据库中提取记录。 使用Excel VBA和SQL SELECT语句,我可以使用WHERE子句提取记录。 现在我正在尝试从数据库中选择成对的记录,但我不确定如何实现这一点 访问表:(注意:表中还有其他列) 我想根据姓名选择配对 例如 然后我想根据第一个DTE进行过滤/选择 Date DTE Name Sc Date DTE Name Sc 41668 AAA425 AdamJ 98 41689 AD
Date DTE Name Sc Date DTE Name Sc
41668 AAA425 AdamJ 98 41689 ADE450 AdamJ 56
41668 AAA425 AdamJ 98 41789 AFF350 AdamJ 74
有谁能给我指出正确的方向,告诉我如何实现这一目标吗?我不完全理解你想做什么(或者为什么),但你可以用这样的方法来实现: 选择您的主要驾驶记录:
select max(date),
name
from NameDates (or whatever you called your table)
group by name;
因此,这将为您提供每个人的最新记录
现在将该选择连接到同一表中的另一个选择:
with mainName as
(select max(date) as main_date,
name as main_name
from NameDates (or whatever you called your table)
group by name
)
select main_date,
main_name,
date,
name,
sc
from mainName,
NamesDates
where main_name = name
and main_date != date;
检查它是否在这里工作:
我不完全理解您想做什么(或为什么),但您可以通过以下方式来完成: 选择您的主要驾驶记录:
select max(date),
name
from NameDates (or whatever you called your table)
group by name;
因此,这将为您提供每个人的最新记录
现在将该选择连接到同一表中的另一个选择:
with mainName as
(select max(date) as main_date,
name as main_name
from NameDates (or whatever you called your table)
group by name
)
select main_date,
main_name,
date,
name,
sc
from mainName,
NamesDates
where main_name = name
and main_date != date;
检查它是否在这里工作:
是的,使用ACCESS SQl进行访问时,可以这样做,如下所示: 假设您的数据保存在一个表中
select mainName.main_date,
mainName.main_name,
NamesDates.date,
NamesDates.name,
NamesDates.sc,
NamesDates.StudentID
from NamesDates
LEFT JOIN
(select max(date) as main_date,
StudentID AS main_StudentID
from NameDates
group by StudentID
) AS mainName,
ON mainName.main_StudentID = NamesDates.StudentID
where mainName.main_date != NamesDates.date;
根据名称匹配记录的请求并不常见,因为名称通常不唯一。通常情况下,人员的唯一标识符将用于将记录与创建的配对进行匹配
注:我怀疑您需要使用“最小(日期)”而不是“最大(日期)”
此外,听起来您需要在主查询和子查询上添加WHERE子句,以将日期限制在您提到的90天期限内
Harvey是的,这可以通过使用ACCESS SQl来完成,如下所示: 假设您的数据保存在一个表中
select mainName.main_date,
mainName.main_name,
NamesDates.date,
NamesDates.name,
NamesDates.sc,
NamesDates.StudentID
from NamesDates
LEFT JOIN
(select max(date) as main_date,
StudentID AS main_StudentID
from NameDates
group by StudentID
) AS mainName,
ON mainName.main_StudentID = NamesDates.StudentID
where mainName.main_date != NamesDates.date;
根据名称匹配记录的请求并不常见,因为名称通常不唯一。通常情况下,人员的唯一标识符将用于将记录与创建的配对进行匹配
注:我怀疑您需要使用“最小(日期)”而不是“最大(日期)”
此外,听起来您需要在主查询和子查询上添加WHERE子句,以将日期限制在您提到的90天期限内
Harvey访问表的主键是什么?哪个字段使记录唯一?您的第一个示例输出似乎表明您需要每个可能对的每个可能组合。我建议将记录集加载到变量数组和/或字典中,并在输出到工作表之前在其中执行处理。MS SQL可能有机会使用各种形式的分区表实现这一点,但我不认为直接从MS Access实现这一点是可行的。基本上,我希望每次对每个测试(DTE)的sc(测试分数)进行回归。DTE=测试,姓名=学生姓名,Sc=测试分数。我意识到将会有成千上万对。我希望将匹配限制在某个日期段(即日期之前)和/或配对之间的日期差<90。每个记录都有一个唯一的索引号。如果方便的话,我可以用studentID代替student name。Access表的主键是什么?哪个字段使记录唯一?您的第一个示例输出似乎表明您需要每个可能对的每个可能组合。我建议将记录集加载到变量数组和/或字典中,并在输出到工作表之前在其中执行处理。MS SQL可能有机会使用各种形式的分区表实现这一点,但我不认为直接从MS Access实现这一点是可行的。基本上,我希望每次对每个测试(DTE)的sc(测试分数)进行回归。DTE=测试,姓名=学生姓名,Sc=测试分数。我意识到将会有成千上万对。我希望将匹配限制在某个日期段(即日期之前)和/或配对之间的日期差<90。每个记录都有一个唯一的索引号。如果方便的话,我可以使用studentID而不是student name。这种语法在access中不起作用,但在SQL Server中应该起作用。OK!(我喜欢sqlfiddle链接-非常有用-谢谢。我已经将您的SQL编写为access SQLI,我不只是想与第一个(最新的)匹配)记录。我需要将第1个与第2个、第1个与第3个、第2个与第3个等进行匹配。因此有很多匹配。我正在尝试对测试分数进行回归,以查看不同测试的测试分数之间的关系。在我的示例中,AAA425的测试分数=ADE450+42的测试分数。理论上我应该有很多匹配项(数千,甚至数百万)但通过筛选每个DTE的匹配项(测试,一次一个),将有<千。我目前使用Excel vba从我的表中提取数据集来做完全相同的事情。此语法在access中不起作用,但在SQL Server中应该起作用。OK!(我喜欢sqlfiddle链接-非常有用-谢谢。我已经将您的SQL编写为access SQLI,我不只是想与第一个(最新的)匹配)记录。我需要将第1个与第2个、第1个与第3个、第2个与第3个等进行匹配。因此有很多匹配。我正在尝试对测试分数进行回归,以查看不同测试的测试分数之间的关系。在我的示例中,AAA425的测试分数=ADE450+42的测试分数。理论上我应该有很多匹配项(数千,甚至数百万)但通过过滤每个DTE的匹配项(测试,一次一个)将有<千个。我目前使用Excel vba从我的表中提取数据集,执行完全相同的操作。如果方便的话,我可以使用学生ID而不是名称。是的,您应该尽可能使用主键字段进行查找和联接。学生ID不是主键。每条记录都有一个唯一的标识符(索引号).DTE、Sc、名称和日期