【问题标题】:Can someone shortly explain the relationship between these two tables有人可以简要解释这两个表之间的关系吗
【发布时间】:2021-03-07 19:10:09
【问题描述】:

-我想在这两个表之间建立关系。

-如您所见,这两个表理论上是相互关联的。

-表二的ser_id是在表一的'value'行下找到的。 但仅在名称为“Apliance”的列中。

-我如何建立参考以及这是什么类型的关系。对我来说,仅在 'value' 和 'ser_id' 之间创建引用是合乎逻辑的

-我目前正在使用 mysql 工作台

【问题讨论】:

  • 请解释一下“什么样的关系”是什么意思?可能的关系有哪些示例?
  • 关系为:WHERE T1.name = 'Aplicance' AND T1.value = T2.ser_id.
  • 感谢您的快速答复。我的意思是关系(1:n或1:1或n:m)。我忘了补充说我想在 Mysql Workbench 的 EER 图中创建关系,我想与这些“箭头”建立关系。
  • 表 1 的设计对我来说看起来不正确 - 设备/日期/加载时间不应该是单个记录的列吗?我想你可以在这两张表之间建立理论上的关系,但不是你可以物理化的一张(在我知道的任何数据库中)。关系模型与列可能包含的值无关 - 您不能定义仅基于列中的值应用的关系
  • 为什么需要关联这些表?表 2 没有显示任何其他数据。

标签: mysql sql mysql-workbench


【解决方案1】:

简单地说,这些表并没有真正的关系,不像为关系数据库定义的那样。

如果您只想确定 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 是一个实体/属性/值结构,尽管实体没有明确标识(可能是一些事件,例如测试?)。我会假设:

  1. 每个连续的 3 条记录组与同一个实体相关联,并且每组中始终有 3 条且只有 3 条记录
  2. Apliance 值在 Table1 中不重复,ser_id 在 Table2 中也不重复
  3. 索引始终为正且递增。

基于这些假设,使用 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;

【讨论】:

    猜你喜欢
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多