Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ms access 规范化现有MS Access数据库_Ms Access_Normalizing - Fatal编程技术网

Ms access 规范化现有MS Access数据库

Ms access 规范化现有MS Access数据库,ms-access,normalizing,Ms Access,Normalizing,我有一个大型access数据库,需要将其规范化为五个表和一个查找表。我理解规范化背后的理论,并且已经勾勒出了表的外观,但是我不知道如何转换表以使数据库规范化。表格分析器没有提供我想要的细分 查询,特别是联合查询,能提供解决方案吗?您在哪里发现了问题?该数据库是一个非常典型的数据库,没有什么特别之处可以将其与其他数据库区分开来 数据库由一个表组成,其中包含: 公司名称、地址、电话等。 具有典型相关领域的联系人 这将基本上作为一个营销数据库,我将需要保持跟踪事件,商业信函等。我只是不知道如何保持关系

我有一个大型access数据库,需要将其规范化为五个表和一个查找表。我理解规范化背后的理论,并且已经勾勒出了表的外观,但是我不知道如何转换表以使数据库规范化。表格分析器没有提供我想要的细分

查询,特别是联合查询,能提供解决方案吗?您在哪里发现了问题?

该数据库是一个非常典型的数据库,没有什么特别之处可以将其与其他数据库区分开来

数据库由一个表组成,其中包含:

公司名称、地址、电话等。 具有典型相关领域的联系人


这将基本上作为一个营销数据库,我将需要保持跟踪事件,商业信函等。我只是不知道如何保持关系完整。

你是说“关系”窗口中的关系吗?这些可以很容易地重建。还是说关键领域等?这有时很困难,可能涉及中间表。每种情况都不同。正如doofledorfer所说,如果发布模式,您可能会得到更具体的建议。

如果您只有一个表,请在其中添加一个自动编号字段

然后创建其他表,并使用原始单个表中的“自动编号”值作为外键,将它们连接回原始数据

如果您有tblPerson:

  tblPerson
  LastName, FirstName, WorkPhone, HomePhone
您想将其分解,添加PersonID autonumber,然后创建一个电话表:

  tblPhone
  PhoneID, PersonID, PhoneNumber, Type
然后将tblPerson中的数据附加到适当的字段中:

  INSERT INTO tblPhone (PersonID, PhoneNumber, Type)
  SELECT tblPerson.PersonID, tblPerson.WorkPhone, "Work"
  FROM tblPerson
  WHERE tblPerson.WorkPhone Is Not Null;
然后对家用电话运行另一个查询:

  INSERT INTO tblPhone (PersonID, PhoneNumber, Type)
  SELECT tblPerson.PersonID, tblPerson.HomePhone, "Home"
  FROM tblPerson
  WHERE tblPerson.HomePhone Is Not Null;
有人建议使用联合查询,您必须将其保存,因为在Jet SQL中不能将联合查询作为子选择。保存的查询如下所示:

  SELECT tblPerson.PersonID, tblPerson.WorkPhone, "Work" As Type
  FROM tblPerson
  WHERE tblPerson.WorkPhone Is Not Null
  UNION ALL 
  SELECT tblPerson.PersonID, tblPerson.HomePhone, "Home" As Type
  FROM tblPerson
  WHERE tblPerson.HomePhone Is Not Null;
如果将其另存为qryPhones,则应使用以下SQL追加qryPhones:

  INSERT INTO tblPhone (PersonID, PhoneNumber, Type)
  SELECT qryPhones.PersonID, qryPhones.WorkPhone, qryPhones.Type
  FROM qryPhones;

显然,这只是最简单的例子。你会对所有字段执行相同的操作。关键是您必须为源表创建一个PK值,该值将所有派生记录绑定回原始表。

从未考虑联合查询。在我分开表格后,我不知道保持关系完整所需的步骤。这是一个极好且详细的回答。但愿我能不止一次投赞成票@David W.Fenton:“在Jet SQL中不能将联合查询作为子选择”——不正确。在ANSI-92查询模式下使用Northwind尝试此操作:
选择DT1.digit FROM(选择DISTINCT 1作为订单中的数字联合选择DISTINCT 2作为订单中的数字)作为DT1