Mysql 找不到缺少的别名:每个派生表都必须有自己的别名

Mysql 找不到缺少的别名:每个派生表都必须有自己的别名,mysql,sql,alias,Mysql,Sql,Alias,这里有两张简单的桌子 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

这里有两张简单的桌子

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种产品的供应商增加VEN_状态。以下是我的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
); 
但我有一个错误:每个派生表都必须有自己的别名。我不知道我错在哪里,因为每个SELECT都有自己的别名

UPD1:在注释帮助下,我发现了错误的更新语法,并将其更改为

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更新shopdb_1.0。供应商设置VEN_状态=VEN_状态+1 其中,从shopdb_1.0中选择VEN_代码。供应商为N 其中,从shopdb_1.0.PRODUCT中选择COUNT*作为T,其中 V_代码=V_代码>15错误代码:1093。不能指定目标 从第0.000节开始更新的表“供应商”

错误来自更新选择。。。。。您应该指定要更新的表的名称。您可以稍微简化查询:

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
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;

对于productV_代码的索引,这可能具有良好的性能。

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

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;

使用productV_代码索引时,这可能具有良好的性能。

将shopdb_1.0中的SELECT*更新为p集????检查手册中更新查询的语法,因此始终向我们显示所有错误消息,不要总结,因为您经常会遗漏一些内容relevant@RiggsFolly你说得对,但是更新shopdb_1.0.VENDOR SET。。。无论如何都不起作用它以什么方式不起作用请具体说明并在您的应用程序中显示任何错误消息Question@RiggsFolly问题已根据您对错误消息的请求在中更新。更新选择*来自shopdb_1.0。供应商为P集????检查手册中更新查询的语法,因此始终向我们显示所有错误消息,不要总结,因为您经常会遗漏一些内容relevant@RiggsFolly你说得对,但是更新shopdb_1.0.VENDOR SET。。。无论如何都不起作用它以什么方式不起作用请具体说明并在您的应用程序中显示任何错误消息Question@RiggsFolly问题已根据您对错误消息的请求更新,非常感谢,但我想编写不带分组和的查询HAVING@AlexIdest为什么?这将更加复杂和缓慢,因为我正在尽可能简单地做这件事。但几分钟后,我就完全理解了您的查询。非常感谢,但我想在不使用分组和的情况下编写查询HAVING@AlexIdest为什么?这将更加复杂和缓慢,因为我正在尽可能简单地做这件事。但几分钟后,我完全理解了你的问题。