【问题标题】:adding an existing column to an existing table MS_Access将现有列添加到现有表 MS_Access
【发布时间】:2013-02-21 08:31:02
【问题描述】:

一点背景:

在这个项目中,我试图合并从不同应用程序中获取的 2 个表。

其中一个应用程序给了我几个表格,我已经成功地将它们组合成一个表格:

DB_Total 

另一个应用程序给了我一个只有标记名的表。这个表叫做:

TagNames_EA

现在,我想将“TagNames_EA”表中的“名称”列添加到“DB_Total”表中,以便比较“名称”字段中的值。

到目前为止,我有这段代码可以比较和过滤掉不匹配的名称:

SELECT
    d.Address,
    d.Type,
    d.Name,
    IIf(t.Name Is Null, False, True) AS match_found
FROM
    DB_Total AS d
    LEFT JOIN TagNames_EA AS t
    ON d.Name = t.Name;

这很好用,但我还想查看 DB_Total 表中 TagNames_EA 表中的“名称”值。


我知道可以在现有表中添加一列

ALTER TABLE DB_Total
ADD Names_EA

但是,当我尝试这个时:

ALTER TABLE DB_Total
ADD Names FROM TagNames_EA AS Names_EA

没有用

有没有简单的方法可以做到这一点?

编辑:我试图简化我解释我的情况的方式。

Edit2:示例

在“DB_Total”表中,我有一个名称列表,应该与“EA_Names”表中的名称完全相同。

DB_Total:
     Name
S1\SVS_AK\ENA[3]
S1\SVS_AK\ENA[4]
S1\SVS_AK\ENA[5]
S1\SVS_AK\ENA[6]
S1\SVS_AK\ENA[7]
S1\SVS_AK\ENA[8]

但是,有时会出错,我想检查是否存在不匹配的名称。像这样:

TagNames_EA
    Name
S1\SVS_AK\ENA[3]
S1\SVS_AK\ENA[4]
S1\SVS_AK\ENA[5]
S1\SVS_AK\EMA[6]  <--- This is a Mistake and will come up as a mismatch
S1\SVS_AK\ENA[7]
S1\SVS_AK\ENA[8]

目前,我使用的代码向我的 DB_Total 表添加了一个新列,其值为“-1”(用于匹配)或值“0”(用于不匹配的名称)

看起来像这样:

DB_Total:               
     Name               match_found
S1\SVS_AK\ENA[3]            -1
S1\SVS_AK\ENA[4]            -1
S1\SVS_AK\ENA[5]            -1
S1\SVS_AK\ENA[6]             0
S1\SVS_AK\ENA[7]            -1
S1\SVS_AK\ENA[8]            -1

我想要完成的是一个包含以下内容的表格:

DB_Total:               
     Name                 Names_EA       match_found
S1\SVS_AK\ENA[3]     S1\SVS_AK\ENA[3]        -1
S1\SVS_AK\ENA[4]     S1\SVS_AK\ENA[4]        -1
S1\SVS_AK\ENA[5]     S1\SVS_AK\ENA[5]        -1
S1\SVS_AK\ENA[6]     S1\SVS_AK\EMA[6]         0
S1\SVS_AK\ENA[7]     S1\SVS_AK\ENA[7]        -1
S1\SVS_AK\ENA[8]     S1\SVS_AK\ENA[8]        -1

在 Joe 发表评论后,如果我还想在同一个表中查看 EA_Table 的名称值,我开始怀疑这是正确的方法。

【问题讨论】:

  • 我很困惑。你是按名字加入的。因此,Tagnames_EA 表中的名称已经存在 - 它们与 DB_Total 表中的名称相同。您是否要求也显示不匹配的内容?
  • 我理解这种困惑,我会尽量让过去两周没有使用此数据库的人更清楚一点!
  • 目前,它在 DB_Total 表中添加一个名为“match_found”的列 如果两个表中的名称匹配,则“match_found”列中的相应字段返回“-1”,如果它们不' t 匹配,它返回一个“0”
  • 抱歉,这无济于事,因为我认为您没有理解我的评论。根据您在上面发布的 SQL 代码,您的新表(如果您从该选择创建它)将包含 DB_Total 表的所有行,如果它在 tagnames 表中找到,则带有指示符;但是没有第二个变量可以添加。您能否展示每个表格中的数据示例以及您希望看到的结果?
  • 您将如何确定 EMA 行应与 ENA 行匹配?当然,您的加入不会实现这一点。

标签: sql ms-access ms-access-2007


【解决方案1】:

您的 ALTER 语句当然行不通。您通常会首先添加一个空的可 NULL 列,然后使用第二个 INSERT 语句来填充数据。但是,除了 name 之外,您还必须有另一列来定义 _EA 表中的值对 DB_Total 表的作用,否则您将无法 100% 确定您匹配两者中的正确行表格。

您可以尝试以下方法来获得我认为您想要的结果:

选择 d.地址, d.类型, d.姓名, t.name, IIf(t.Name Is Null, False, True) AS match_found 从 DB_Total AS d 左连接 TagNames_EA AS t ON d.Name = t.Name;

这应该会显示两个名称结果并排显示。但是,如果您有一些明确的 ID 值来确保您确实拥有正确匹配的行,则可能会更容易。

【讨论】:

    【解决方案2】:
    SELECT
        d.Address,
        d.Type,
        d.Name,
        IIf(t.Name Is Null, False, True) AS match_found,
        t.name as name_ea
    FROM
        DB_Total AS d
        FULL OUTER JOIN JOIN TagNames_EA AS t
        ON d.Name = t.Name;
    

    这会给你不匹配;但是,它实际上并没有显示哪个匹配项 - 稍后由您决定哪个对应项。

    【讨论】:

    • 此代码在 SELECT 指令中将 t.name 中的“t”高亮为 name_ea 后生成错误
    • 我漏掉了一个逗号,再试一次。
    猜你喜欢
    • 2016-11-13
    • 2016-07-04
    • 2017-04-29
    • 2020-12-19
    • 2018-02-21
    • 1970-01-01
    • 2012-01-22
    • 2014-10-18
    相关资源
    最近更新 更多