簡體   English   中英

從另一個表 MySQL 更新行設置唯一值

[英]Update rows set uniqe values from another table MySQL

例如,我有兩張桌子。 首先包含生成的連續劇以獲取詳細信息。 第二個包含生產的數據。 我需要在第二個中插入唯一的序列號。

T1

t1.ID t1.OBJ_TYPE t1.OBJ_SERIAL
1 5 DRW157001
2 5 DRW157002
3 5 DRW157003
4 5 DRW157004
5 5 DRW157005
6 5 DRW157006

T2

t2.ID t2.DETAIL_TYPE t2.DETAIL_SERIAL
1 5 DRW157001
2 5 DRW157005
3 5 NULL
4 5 NULL
5 5 NULL
6 5 NULL

更新后可以這樣嗎?

結果

t2.ID t2.DETAIL_TYPE t2.DETAIL_SERIAL
1 5 DRW157001
2 5 DRW157005
3 5 DRW157002
4 5 DRW157003
5 5 DRW157004
6 5 DRW157006

SQL查詢

UPDATE t2, t1 SET t2.DETAIL_SERIAL = (SELECT t1.OBJ_SERIAL FROM t1 LIMIT 1 ) WHERE t1.OBJ_TYPE = t2.DETAIL_TYPE

是的,可以在UPDATE中使用JOIN ,如下所示:

UPDATE t2 
 INNER JOIN 
(SELECT T2ID, OBJ_SERIAL 
   FROM (SELECT T1.*, T2.ID T2ID, 
                ROW_NUMBER() OVER (ORDER BY T1.ID) AS T1RN,
                ROW_NUMBER() OVER (ORDER BY T2.ID) AS T2RN
           FROM T1 JOIN T2 ON T1.OBJ_TYPE = T2.DETAIL_TYPE
          WHERE T2.DETAIL_SERIAL IS NULL
            AND NOT EXISTS 
                (SELECT 1 FROM T2 T22 
                  WHERE T1.OBJ_TYPE = T22.DETAIL_TYPE
                    AND T22.DETAIL_SERIAL = T1.OBJ_SERIAL 
                 )
        ) T 
  WHERE T1RN = T2RN) T
 SET T2.DETAIL_SERIAL = T.OBJ_SERIAL 
 WHERE T2.ID = T.T2ID

現在我有了那個代碼,它對我有用。

SET @i := 0;
SET @j := 0;

UPDATE t2 DST LEFT JOIN 
(
    SELECT TD1.RNT1, TD1.OBJ_SERIAL, TD2.IDX, TD2.RNT2, TD2.DETAIL_SERIAL FROM 
    (
        SELECT @i := @i + 1 AS RNT1, TSRC1.OBJ_SERIAL FROM t1 TSRC1 WHERE NOT EXISTS ( SELECT 1 FROM t2 TSH1 WHERE TSRC1.OBJ_SERIAL = TSH1.DETAIL_SERIAL AND )
    ) TD1 
    LEFT JOIN 
    (
        SELECT @j := @j + 1 AS RNT2, TSRC2.ID IDX, TSRC2.DETAIL_SERIAL FROM t2 TSRC2 WHERE NOT EXISTS (SELECT 1 FROM t1 TSH2 WHERE TSRC2.DETAIL_SERIAL = TSH2.OBJ_SERIAL) AND TSRC2.DETAIL_SERIAL IS NULL
    ) TD2 
    ON TD1.RNT1 = TD2.RNT2 AND TD1.OBJ_TYPE = TD2.DETAIL_TYPE
) TD3 
ON DST.ID = TD3.IDX 
SET DST.DETAIL_SERIAL = TD3.OBJ_SERIAL
WHERE TD3.IDX IS NOT NULL;

有沒有更好的辦法?

這是復雜的。 想法是執行以下操作:

  1. 枚舉t2detail_serialNULL的行。
  2. 枚舉t1中未在t2中使用obj_serial的行。
  3. 一起加入update

使這更復雜的是,(1)需要一個額外的join (到下面查詢中的tt2 ):

update t2 join
       (select t2.*,
               row_number() over (order by t2.id) as seqnum
        from t2
        where t2.DETAIL_SERIAL is null
       ) tt2
       on t2.id = tt2.id join
       (select t1.*,
               row_number() over (order by t1.id) as seqnum
        from t1
        where not exists (select 1
                          from t2
                          where t2.DETAIL_SERIAL = t1.OBJ_SERIAL
                         )
       ) t1
       on t1.seqnum = tt2.seqnum
    set t2.DETAIL_SERIAL = t1.OBJ_SERIAL;

我不太確定obj_type適合的位置。但是,如果它也需要匹配,則將其包含在not exists的子查詢和最終連接中。 或者,也許您只是想過濾該值。

是一個 db<>fiddle。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM