一点背景:
在这个项目中,我试图结合两个表,我从不同的应用程序中获取。
其中一个应用程序为我提供了几个表格,我已经成功地合并到一个表格中:
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的名称值,这是正确的方法。
任何帮助将不胜感激!
答案 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;
这给了你不匹配的东西;但它实际上并没有告诉你哪个匹配到哪个 - 你可以自己决定以后的相应内容。