找不到丢失的别名:每个派生 table 必须有自己的别名

Can't find missing alias: every derived table must have its own alias

这里有两个简单的tables

CREATE TABLE `shopdb_1.0`.VENDOR(
    VEN_CODE INT,
    VEN_NAME VARCHAR(20),
    VEN_STATUS INT
);
CREATE TABLE `shopdb_1.0`.PRODUCT (
  P_CODE INT,
  P_DECSRIOTION VARCHAR(20),
  P_PRICE INT,
  P_COUNT INT,
  V_CODE INT references VENDOR(VEN_CODE)
);

我想为每个拥有超过 15 个 PRODUCTVENDOR 递增 VEN_STATUS。这是我的 SQL 查询:

UPDATE (SELECT * FROM `shopdb_1.0`.VENDOR AS P) 
SET VEN_STATUS = VEN_STATUS + 1 
WHERE VEN_CODE IN (
SELECT VEN_CODE FROM `shopdb_1.0`.VENDOR AS N
    WHERE (
    SELECT COUNT(*) FROM `shopdb_1.0`.PRODUCT AS T WHERE V_CODE = VEN_CODE) > 15
); 

但是我有这个错误:每个派生的 table 必须有自己的别名 。我不知道我哪里错了,因为每个 SELECT 都有自己的别名。

UPD1:在评论的帮助下,我发现了错误的 UPDATE 语法并将其更改为

UPDATE `shopdb_1.0`.VENDOR
SET VEN_STATUS = VEN_STATUS + 1 
WHERE VEN_CODE IN (
    SELECT VEN_CODE FROM `shopdb_1.0`.VENDOR AS N
    WHERE (
        SELECT COUNT(*) FROM `shopdb_1.0`.PRODUCT AS T 
            WHERE V_CODE = VEN_CODE) > 15
); 

但是我还有一个问题:

18:09:59 UPDATE shopdb_1.0.VENDOR SET VEN_STATUS = VEN_STATUS + 1 WHERE VEN_CODE IN ( SELECT VEN_CODE FROM shopdb_1.0.VENDOR AS N WHERE ( SELECT COUNT(*) FROM shopdb_1.0.PRODUCT AS T WHERE V_CODE = VEN_CODE) > 15 ) Error Code: 1093. You can't specify target table 'VENDOR' for update in FROM clause 0.000 sec

错误来自 UPDATE (SELECT....。您应该指定要更新的 table 的名称。您可以稍微简化查询:

UPDATE `shopdb_1.0`.VENDOR
SET VEN_STATUS = VEN_STATUS + 1 
WHERE VEN_CODE IN (
    SELECT V_CODE 
    FROM `shopdb_1.0`.PRODUCT
    GROUP BY V_CODE
    HAVING COUNT(*) > 15
); 

您可以使用相关子查询编写逻辑:

UPDATE `shopdb_1.0`.VENDOR v
    SET VEN_STATUS = VEN_STATUS + 1 
    WHERE (SELECT COUNT(*)
           FROM `shopdb_1.0`.PRODUCT p
           WHERE v.V_CODE = p.VEN_CODE
          ) > 15;

如果在 product(V_CODE) 上建立索引,这可能会有很好的性能。