找不到丢失的别名:每个派生 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 个 PRODUCT
的 VENDOR
递增 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)
上建立索引,这可能会有很好的性能。
这里有两个简单的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 个 PRODUCT
的 VENDOR
递增 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 FROMshopdb_1.0
.VENDOR AS N WHERE ( SELECT COUNT(*) FROMshopdb_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)
上建立索引,这可能会有很好的性能。