[英]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;
有沒有更好的辦法?
這是復雜的。 想法是執行以下操作:
t2
中detail_serial
為NULL
的行。t1
中未在t2
中使用obj_serial
的行。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.