【问题标题】:How can I do a SQL inner join where a value in ANY column matches?如何在任何列中的值匹配的情况下执行 SQL 内连接?
【发布时间】:2020-01-31 08:33:17
【问题描述】:

我在 Access 数据库中有两个表。一张是考勤桌,另一张是学生桌。出勤表包含日期和学生证。 ID 是学生表中的主键,出席日期是出勤表中的 pk。我想要的是一个返回日期和学生姓名的查询,以便我可以将它们显示给用户。复杂之处在于,出勤表每个日期最多包含 75 个学生 ID,所以如果我进行标准内部联接,它必须包含 75 个“OR”子句,这非常麻烦,而且 Access 无论如何都只允许 20 个内部联接. 有没有办法我可以做这样的事情:

SELECT a.attendanceDate FROM (Attendance as a WHERE a.[attendanceDate] BETWEEN #01/01/2020# AND #01/31/2020# INNER JOIN Students AS s ON s.[studentID] = a.[ANY_COLUMN]);

在此示例中,它应返回 2020 年 1 月的出勤记录,如下所示:

2020 年 1 月 2 日“迈克·约翰逊”

2020 年 1 月 10 日“迈克·约翰逊”、“玛丽·史密斯”

2020 年 1 月 25 日“玛丽·史密斯”、“查德·琼斯”、“凯里·欧文”

【问题讨论】:

  • 出席有 75 列的学生 ID?那将是糟糕的数据模型。
  • 我同意 ComputerVersteher 的观点,即您的问题是不合适的数据模型。你应该改变它。否则,您的许多查询将不得不“繁琐”(而且速度很慢)。
  • 关于你的结果:'Mary Smith', 'Chad Jones', 'Kyrie Erving' 应该是一个字符串吗?据我所知,MS-Access 没有字符串聚合功能,因此您必须在您的应用程序(VBA 脚本?)中执行此操作,并且只选择原子数据(01/25/2020 'Mary Smith'01/25/2020 'Chad Jones'01/25/2020 'Kyrie Erving')。
  • 返回值应该是记录集或表格的形式

标签: sql ms-access


【解决方案1】:

快速修复:创建一个将出勤作为记录源的表单,并为每个学生列创建一个组合框,Select id, Studentname From Students作为数据源,绑定列 = 1,宽度列 1 =0。这将显示所有学生,每列一列。

如果要将学生作为一个单独的字符串,请将 id 替换为 name 并将所有列连接为一个:

SELECT
    attendanceDate,
    Dlookup("Studentname","Students","id = " & StudentID1) & "," &
    Dlookup("Studentname","Students","id = " & StudentID2 ) & "," &
    ... 
    Dlookup("Studentname","Students","id = " & StudentID75 ) AS AllStudents
FROM
    Attendance

但是尽快修复你的数据模型!

正如@Thorsten Kettner 所说:两个字段,一个用于日期,一个用于学生ID。 PK 现在是 date 和 id 的组合。

您可以在查询中使用GetList 组合具有相同日期的行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-02
    • 2022-07-01
    • 1970-01-01
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    相关资源
    最近更新 更多