首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL -要更新的复杂SELECT查询

SQL -要更新的复杂SELECT查询
EN

Stack Overflow用户
提问于 2021-03-17 16:46:51
回答 1查看 43关注 0票数 0

SQL noob在这里。所以我有一张桌子,里面有很多产品。其中一些产品是服装,这意味着由于不同的尺寸,我对一个产品有六个不同的SKU。现在,我希望将第一个产品变体设置为每个组的父级。产品ID和父ID都是UUID。我设法编写了一个SELECT查询,它获取所有产品编号,查找所有组(通过删除最后一对编号),并分配所有相应的父(Uu) it和父产品编号(用于人类可读的比较)-它工作得非常好。但是我不知道如何将这个相当复杂的SELECT转换为UPDATE。有谁有主意吗?版本为MySQL 8

Table1看起来像这样(去掉了所有未使用的列):

代码语言:javascript
复制
ID        |product_number      |parent_id
-------------------------------------------
[UUID]1-1 |123-456-01          | NULL
[UUID]1-2 |123-456-02          | NULL
[UUID]1-3 |123-456-03          | NULL
[UUID]1-4 |123-456-04          | NULL
[UUID]2-1 |987-65-43-21-01     | NULL
[UUID]2-2 |987-65-43-21-02     | NULL
[UUID]2-3 |987-65-43-21-03     | NULL
[UUID]2-4 |987-65-43-21-04     | NULL

我的SELECT查询:

代码语言:javascript
复制
SELECT ArticleNumber, ArticleGroup, ParentID, t3.id as ID
FROM (
SELECT t2.product_number as ArticleNumber, GroupTable.GroupNr as ArticleGroup, GroupTable.product_number as ParentID
FROM (
SELECT MIN(result.product_number) as product_number, result.GroupNr
FROM (
        SELECT product_number, 
        SUBSTRING_INDEX(product_number, "-", (LENGTH(product_number) - LENGTH(REPLACE(product_number, "-", "")))) as GroupNr
        FROM table1.product
    ) result
WHERE LENGTH(result.GroupNr) > 0
GROUP BY result.GroupNr
ORDER BY GroupNr
) as GroupTable
JOIN table1.product as t2
ON t2.product_number like concat(GroupTable.GroupNr, '%') AND t2.product_number != GroupTable.product_number
ORDER BY GroupTable.GroupNr 
) as Energija
JOIN table1.product as t3
ON t3.product_number = Energija.ParentID

我想要更新parent_id,使Table1看起来像这样:

代码语言:javascript
复制
ID        |product_number      |parent_id
-------------------------------------------
[UUID]1-1 |123-456-01          | NULL
[UUID]1-2 |123-456-02          | [UUID]1-2
[UUID]1-3 |123-456-03          | [UUID]1-2
[UUID]1-4 |123-456-04          | [UUID]1-2
[UUID]2-1 |987-65-43-21-01     | NULL
[UUID]2-2 |987-65-43-21-02     | [UUID]2-2
[UUID]2-3 |987-65-43-21-03     | [UUID]2-2
[UUID]2-4 |987-65-43-21-04     | [UUID]2-2

它在SELECT查询中起作用,我只是不知道如何对其进行更新。

字符串切换了UUID的示例表:

代码语言:javascript
复制
CREATE TABLE table1.product (
id varchar(255),
product_number varchar(255),
parent_id varchar(255));

INSERT INTO Table1.product (
id, product_number, parent_id)
VALUES(
'1-1',
'123-456-01',
NULL),
(
'1-2',
'123-456-02',
NULL),
(
'1-3',
'123-456-03',
NULL),
(
'1-4',
'123-456-04',
NULL),
(
'2-1',
'987-65-43-21-01',
NULL),
(
'2-2',
'987-65-43-21-02',
NULL),
(
'2-3',
'987-65-43-21-03',
NULL),
(
'2-4',
'987-65-43-21-04',
NULL);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-17 19:32:04

您只需稍微调整查询并在update语句中设置parentUuid,其中产品uuid匹配。

在下面的示例代码中,我调整了您的查询,以获得产品uuid和父uuid之间的映射。然后我更新表,设置产品表中的parent_id,其中products uuid与查询中的产品uuid匹配。

代码语言:javascript
复制
UPDATE table1.product p
SET parent_id = (
    SELECT parentUUID
    FROM (SELECT t3.id as parentUUID, Energija.productuuid as productUuid
          FROM (
                   SELECT t2.id                     as productuuid,
                          t2.product_number         as ArticleNumber,
                          GroupTable.GroupNr        as ArticleGroup,
                          GroupTable.product_number as ParentID
                   FROM (
                            SELECT MIN(result.product_number) as product_number, result.GroupNr
                            FROM (
                                     SELECT product_number,
                                            SUBSTRING_INDEX(product_number, "-",
                                                            (LENGTH(product_number) - LENGTH(REPLACE(product_number, "-", "")))) as GroupNr
                                     FROM table1.product
                                 ) result
                            WHERE LENGTH(result.GroupNr) > 0
                            GROUP BY result.GroupNr
                            ORDER BY GroupNr
                        ) as GroupTable
                            JOIN table1.product as t2
                                 ON t2.product_number like concat(GroupTable.GroupNr, '%') AND
                                    t2.product_number != GroupTable.product_number
                   ORDER BY GroupTable.GroupNr
               ) as Energija
                   JOIN table1.product as t3
                        ON t3.product_number = Energija.ParentID) parentMapping
    where parentMapping.productuuid = p.id);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66669649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档