18

我正在使用微软访问。

如果这个查询:

(SELECT FERMENT.FermentId
FROM FERMENT
INNER JOIN [BELGIUM BEER]
ON
FERMENT.FermentName = [BELGIUM BEER].FermentId ORDER BY [BELGIUM BEER].BeerId) a

返回 FermentId,如何使用该列更新不同的表?

例子:

UPDATE EXAMPLETABLE
SET EXAMPLETABLE.FermentId = a.FermentId
FROM a
(SELECT FERMENT.FermentId
FROM FERMENT
INNER JOIN [BELGIUM BEER]
ON
FERMENT.FermentName = [BELGIUM BEER].FermentId ORDER BY [BELGIUM BEER].BeerId) a
4

3 回答 3

26

不确定EXAMPLETABLE 与您的数据的关系是什么,但总的来说。

在 Access 中,SET 部分在 join 之后,也跳过了 select 部分按顺序排列。应该是这样的

UPDATE FERMENT
INNER JOIN ([BELGIUM BEER]  ON FERMENT.FermentName = [BELGIUM BEER].FermentId) 
SET EXAMPLETABLE.FermentColumn = a.FermentColumn

如果它不起作用,请尝试在查询构建器中构建连接

于 2012-10-14T12:57:35.847 回答
12

不需要定义两个表之间的关系。答案 10 (Arnoldiusss) 几乎是正确的,也是迄今为止最容易理解和最短的解决方案。并且执行速度最快。但是示例代码是错误的。下一个代码来自我的一个应用程序,在 MS ACCESS 2013 中运行良好。

    UPDATE table1 T1 
    INNER JOIN table2 T2 
    ON T2.Id = T1.Id
    SET T1.myField = T2.myField;

对于“比利时啤酒案”(我喜欢这种表达方式;-)它将是:

    UPDATE FERMENT AS T1
    INNER JOIN [BELGIUM BEER] AS T2 ON T1.FermentName = T2.FermentId 
    SET T1.FermentColumn1 = T2.FermentColumn1;
于 2015-12-20T10:22:13.510 回答
7

假设子查询返回多个值,您需要第二个键来连接 (JOIN) 新值和要更新的表 (EXAMPLETABLE)。

在这种情况下,我会尝试这样的事情:

UPDATE T 
SET    T.FERMENTID = A.FERMENTID 
FROM   EXAMPLETABLE AS T 
       INNER JOIN (SELECT FERMENT.FERMENTID, 
                          FERMENT.OTHERID 
                   FROM   FERMENT 
                          INNER JOIN [BELGIUM BEER] 
                                  ON FERMENT.FERMENTNAME = 
                                     [BELGIUM BEER].FERMENTID 
                   ORDER  BY [BELGIUM BEER].BEERID) AS A 
               ON A.OTHERID = T.OTHERID 

如果不是这种情况并且子查询返回单个值,请尝试以下操作:

UPDATE EXAMPLETABLE 
SET    T.FERMENTID = (SELECT FERMENT.FERMENTID
                      FROM   FERMENT 
                             INNER JOIN [BELGIUM BEER] 
                                     ON FERMENT.FERMENTNAME = 
                                        [BELGIUM BEER].FERMENTID 
                      ORDER  BY [BELGIUM BEER].BEERID)

请注意,在这种情况下,您需要保证子查询永远不会返回超过一行!

于 2012-10-14T12:59:52.327 回答