简单地说,这些表并没有真正的关系,不像为关系数据库定义的那样。
如果您只想确定 Table2 中的每个 ser_ID 是否在 Table1 中找到,请通过 JOINing 对 Table1.value 和 Table2.ser_ID 执行“Find Unmatched”查询(将删除 Table1 的日期和加载时间记录)。
SELECT Table2.* FROM Table2
LEFT JOIN Table1 ON Table2.ser_id = Table1.value
WHERE Table1.value Is Null;
或者:
SELECT * FROM Table2 WHERE ser_ID NOT IN (SELECT [value] FROM Table1);
Table1 是一个实体/属性/值结构,尽管实体没有明确标识(可能是一些事件,例如测试?)。我会假设:
- 每个连续的 3 条记录组与同一个实体相关联,并且每组中始终有 3 条且只有 3 条记录
- Apliance 值在 Table1 中不重复,ser_id 在 Table2 中也不重复
- 索引始终为正且递增。
基于这些假设,使用 DCount() 的 Access CROSSTAB 查询可以将 Table1 数据重新排列为规范化结构(具有讽刺意味的是,CROSSTAB 通常会去规范化数据)。
TRANSFORM First(Table1.value) AS FirstOfvalue
SELECT DCount("*","Table1","[name]='" & [name] & "' AND [index]<" & [index])+1 AS GrpID
FROM Table1
GROUP BY DCount("*","Table1","[name]='" & [name] & "' AND [index]<" & [index])+1
PIVOT Table1.name;
GrpID Apliance date loadtime
1 x4500 01.01.2005 14:00:00 44
2 x4501 01.01.2005 14:00:14 60
嵌套查询可以计算组标识符:
SELECT Table1.name, Table1.value,
(SELECT Count(*) AS Seq FROM Table1 AS Dup
WHERE Dup.Name=Table1.Name AND Dup.Index<Table1.Index)+1 AS GrpID
FROM Table1;
很遗憾,使用该查询作为 CROSSTAB 的源失败。
MySQL 没有 DCount() 函数。嵌套查询应该是可能的,但是我不知道它是否可以被旋转,因为我不能让它在 Access 中工作。
CROSSTAB 的替代方案是使用嵌套查询作为聚合查询的源,该查询计算字段以模拟 CROSSTAB:
SELECT Query1.GrpID,
Max(IIf([name]="Apliance",[value],Null)) AS Apliance,
Max(IIf([name]="date",[value],Null)) AS [date],
Max(IIf([name]="loadtime",[value],Null)) AS loadtime
FROM
(SELECT Table1.name, Table1.value,
(SELECT Count(*) AS Seq FROM Table1 AS Dup
WHERE Dup.Name=Table1.Name AND Dup.Index<Table1.Index)+1 AS GrpID
FROM Table1) AS Query1
GROUP BY Query1.GrpID;