【问题标题】:Map fields to their own row in MS Access将字段映射到 MS Access 中自己的行
【发布时间】:2012-05-22 20:49:06
【问题描述】:

我的任务是将数据从 MSSQL 服务器迁移到 MySQL 服务器。我认为首先将 MSSQL 数据库转换为 MS Access 数据库会更容易,这样我就可以搞砸它,然后将其导出为 MySQL。

所以,我有一张表,名为 Companies:

companyID |    name        |     c_phon  |  c_email                   | c_address
    1       StackOverflow     5555555555     Joel@stackoverflow.com      NYC
    2       Google            5558675309     Google@google.com           NYC

在我们的新数据库中,我们更改了这些字段的保存方式。我们使用的是首选项表,而不是每一行都有电话号码、电子邮件和地址。

偏好:

prefID  |  prefName
  1         c_phone
  2         c_email
  3         c_address

我的问题是,如何在 companyPrefs 表中将每个字段转换为它自己的行。它应该看起来像这样:

companyID | prefID | prefValue
    1         1      5555555555
    1         2      Joel@stackoverflow.com
    1         3      NYC
    2         1      5558675309
    2         2      Google@google.com
    2         3      NYC

我不知道如何使用 vbscript 或其他什么,所以我尝试使用 SQL 来做到这一点。

INSERT INTO comanyPrefs (companyID, prefID, prefValue)
SELECT companyID, prefID, @fieldName
FROM companies, preferences
WHERE @fieldName = prefName

显然这不起作用。如何使用变量字段名称选择字段?如何为每个字段插入一行?

【问题讨论】:

    标签: sql ms-access


    【解决方案1】:

    你在正确的轨道上。但是,您需要为每个可能的字段插入,如下所示:

    INSERT INTO companyPrefs (companyID, prefID, prefValue)
    SELECT companyID, (select prefID from prefs where prefName = 'c_phone'), c_phone
    FROM companies where c_phone is not null
    UNION
    SELECT companyID, (select prefID from prefs where prefName = 'c_email'), c_email
    FROM companies where c_email is not null
    UNION
    SELECT companyID, (select prefID from prefs where prefName = 'c_address'), c_address
    FROM companies where c_address is not null
    

    演示:http://www.sqlfiddle.com/#!3/5cf87/1

    【讨论】:

    • 我希望不必手动将每个字段名称添加到查询中。我希望我可以动态地做到这一点。
    • 您可以从 VBA 动态构建代码。例如,在字符串中构建查询,并为每个字段名称,例如strQuery = strQuery & "SELECT companyID ... where prefName = '" & theFieldName & "', " & theFieldName & " FROM companies where " & theFieldName & " is not null",例如。如果您的任何源列不是文本,您还必须进行可能的转换。
    • 我不知道如何使用VB,我认为这样做比手动输入字段名称要花更长的时间:-P
    • 如果您想完全在 SQL 中完成,您可以使用 varchar 变量以相同的方式构建字符串,连接查询,然后使用 exec(@sql) 执行结果。
    • 是的,如果你没有一大堆字段,比如 15-20,这是一个一次性的过程,或者代码只需要编写一次,可能就像易于手动将其全部键入。我喜欢基于成本价值的决策而不是聪明:)
    猜你喜欢
    • 2016-05-12
    • 2018-12-17
    • 2014-05-03
    • 2017-07-22
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2018-07-29
    相关资源
    最近更新 更多