将现有列添加到现有表MS Access

时间:2013-02-21 08:31:03

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

一点背景:

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

其中一个应用程序为我提供了几个表格,我已经成功地合并到一个表格中:

DB_Total 

另一个应用程序为我提供了一个只有Tagnames的表。该表称为:

TagNames_EA

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

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

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表中的“Name”值。


我知道可以使用

将列添加到现有表中
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的名称值,这是正确的方法。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您的ALTER声明当然不会奏效。您通常首先添加一个空的NULL-able列,然后使用第二个INSERT语句来填充数据。但是,除了name之外,您还必须有另一个列,它应该定义_EA表中的值到DB_Total表中的哪个值,否则您将无法保证100%确定您匹配来自两者的正确行表。

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

SELECT
    d.Address,
    d.Type,
    d.Name,
    t.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;

这应该显示两个名字结果彼此相邻。但是,如果您有一些明确的ID值可能会更容易,以确保您确实拥有正确匹配的行。

答案 1 :(得分:1)

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;

这给了你不匹配的东西;但它实际上并没有告诉你哪个匹配到哪个 - 你可以自己决定以后的相应内容。