将新字段添加到现有表,将数据插入到正确位置,然后加入

时间:2012-10-17 04:19:55

标签: sql

场景一 我有两个新字段要添加到名为existingTable的表中。添加这些字段后,我可以使用这些字段的数据更新SOME但不包含所有记录。将有空白条目,我对此很好。

问题一 我想确保更新CORRECT记录。现有表和传入数据表的主键是Email。

建议的解决方案一 看起来像这样的UPDATE查询就是解决方案。

更新现有表格 SET existingTable.newField1 = incomingDataTable.newField1,existingTable.newField2 = incomingDataTable.newField2 WHERE existingTable.Email = incomingDataTable.Email

您怎么看?


情景二 使用新字段更新表后&在适当的记录中的数据,我想加入这个表与另外两个。我希望所有条目,即使某些字段为空,也在此连接中。我不希望排除任何记录。

顺便说一下,这些表中的每条记录与其他表中的伙伴有一对一的关系。不应该有任何重复的记录。在过去,我见过Access使用INNER JOIN,它排除了没有newField1和newField2值的记录。这不是我想要的。

问题 我没有经验加入牌桌。不同的联接对我来说有点混乱。

建议的解决方案 我使用的联接是否必然重要,因为三个待连接表应该具有一对一的关系?

SELECT * FROM existingTable FULL JOIN tableToJoinWith1,tableToJoinWith2 在existingTable.Email = tableToJoinWith1.Email,tableToJoinWith1.Email = tableToJoiNWith2.Email

1 个答案:

答案 0 :(得分:0)

澄清您的场景2.我假设您想要existingTable中的所有行,即使Email字段与其他任何一个表都不匹配。在这种情况下,LEFT JOIN就是您想要的:

SELECT * FROM existingTable
LEFT JOIN tableToJoinWith1 ON existingTable.email = tableToJoinWith1.email 
LEFT JOIN tableToJoinWith2 ON existingTable.email = tableToJoinWith2.email 

对于方案1,问题是您没有为incomingDataTable提供任何类型的SELECT。在标准SQL中,据我所知,没有很好的方法来支持多列。所以它取决于你正在使用的数据库。有些人会允许你这样做:

UPDATE existingTable
SET newField1 = incomingDataTable.newField1, newField2 = incomingDataTable.newField2 
FROM incomingDataTable
WHERE existingTable.Email = incomingDataTable.Email

但有些人不会。其他人会允许这样做:

UPDATE (Select * FROM existingTable JOIN incomingDataTable
ON existingTable.Email = incomingDataTable.Email)
SET existingTable.newField1 = incomingDataTable.newField1,
existingTable.newField2 = incomingDataTable.newField2

如果它只是一个列,你可以这样做,这是完全标准的:

UPDATE existingTable SET newField1 = (SELECT newField1 FROM incomingDataTable 
WHERE existingTable.Email = incomingDataTable.Email)