代码之家  ›  专栏  ›  技术社区  ›  Kip

如何使用Access中的子查询执行更新查询?

  •  15
  • Kip  · 技术社区  · 15 年前

    我想把这个SQL查询移植到一个Access数据库中,它在SQL Server、MySQL和Oracle上工作得很好。我该怎么做? 现在它出于某种原因提示我要一个公司ID。

    编辑 :我收到提示是因为我忘记了首先在VendorRegKeys中创建公司ID列。现在出现错误“操作必须使用可更新的查询”。

    UPDATE VendorRegKeys
       SET Company_ID = (SELECT Users.Company_ID
                         FROM Users
                         WHERE Users.User_ID = VendorRegKeys.CreatedBy_ID)
    

    更新 :我发现这是基于 JuniorFlip 答案是:

    UPDATE VendorRegKeys, Users
    SET VendorRegKeys.Company_ID = Users.Company_ID
    WHERE VendorRegKeys.CreatedBy_ID = Users.User_ID
    
    3 回复  |  直到 8 年前
        1
  •  13
  •   shahkalpesh    15 年前

    那可能是因为公司 不是 VendorRegKeys或用户中的现有字段。

    编辑:

    UPDATE VendorRegKeys
    INNER JOIN Users ON Users.User_ID = VendorRegKeys.CreatedBy_ID
    SET VendorRegKeys.Company_ID = Users.Company_ID
    
        2
  •  11
  •   onedaywhen    8 年前

    直截了当的回答是:不能这样做。即使在自己所谓的ansi-92查询模式下,Access数据库引擎simple也不支持普通的SQL-92标量子查询语法。

    您必须使用它自己的专有语法,这种语法不会强制执行标量要求,即不安全,并且会随意、安静地选择一个值**。此外,除了简单的构造之外,它根本不起作用,尤其是当子查询(如果允许首先使用一个)使用set函数时。( MAX ,请 SUM 等)——参见 this article 对于一些非常不满意的解决方法。

    很抱歉是否定的,但这确实是基本语法,我不明白为什么访问团队还没有着手修复它。这是我不能再认真对待Access数据库引擎的无可争议的第一个原因。


    演示专有访问的不安全行为 UPDATE..JOIN..Set 句法

    CREATE TABLE Users
    ( 
      User_ID CHAR( 3 ) NOT NULL,
      Company_ID CHAR( 4 ) NOT NULL,
      UNIQUE ( Company_ID, User_ID ) );
    
    CREATE TABLE VendorRegKeys
      CreatedBy_ID CHAR( 3 ) NOT NULL UNIQUE,
      Company_ID CHAR( 4 ) );
    
    INSERT INTO Users VALUES ( 'Kip', 'MSFT' );
    INSERT INTO Users VALUES ( 'Kip', 'AAPL' );
    
    INSERT INTO VendorRegKeys VALUES ( 'Kip', NULL );
    
    UPDATE VendorRegKeys
    INNER JOIN Users ON Users.User_ID = VendorRegKeys.CreatedBy_ID
    SET VendorRegKeys.Company_ID = Users.Company_ID;
    

    在access中执行update语句时,用户界面警告我们

    您将要更新2行。

    尽管事实上 VendorRegKeys 桌子!

    在实践中发生的只是我们将用来更新该行中的列的值之一,而没有可靠的方法来预测它将是哪一个。

    使用标准SQL的标量子查询语法,您将得到一个错误,并且语句将无法执行,这无疑是所需的功能(标准SQL MERGE 语法也是这样)。

        3
  •  8
  •   Kip    15 年前

    你可以试试这个

    update a
    set a.company_id = b.company_id
    from vendorRegkeys a, users b
    where a.createdby_id = b.user_id