将一列中的外键转换为另一列中的值

2wnc66cl  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(326)

我有三张table
仪器操作

InstrumentStatusId    StatusDataKeyId
         1                       0
         2                       0 
         3                       0
         4                       0
         5                       0

仪器状态

Id       Name
         1      ACTIVE
         2     INACTIVE
         3     MAINTENANCE
         4     SERVICE  
         5     BROKEN

Jmeter 状态数据键

Id       Name
         1     MAINTENANCE
         2     SERVICE  
         3     BROKEN
``` `InstrumentStatusId` 在 `InstrumentOperation` 引用中条目的id `InstrumentStatus` . 与相同 `StatusDataKeyId` 以及 `InstrumentStatusDataKey` .
我想要那个 `StatusDataKeyId` 中的列 `InstrumentOperation` 要填充的表 `Id` 中的条目 `InstrumentStatusDataKey` 正确地对应于 `Id` 中的条目 `InstrumentStatus` 如果存在匹配的名称,则保留 `0` . 例如,答案是:
仪器操作

InstrumentStatusId StatusDataKeyId
1 0
2 0
3 1
4 2
5 3

我提出的查询只有在 `InstrumentStatusId` 是 `1` 除了一行。。。

UPDATE InstrumentOperation SET StatusDataKeyId = (
SELECT
InstrumentStatusDataKey.Id
FROM (SELECT * FROM InstrumentStatusDataKey) AS InstrumentStatusDataKey
JOIN InstrumentStatus ON InstrumentStatus.Name = InstrumentStatusDataKey.Name
JOIN (SELECT * FROM InstrumentOperation) AS InstrumentOperation ON InstrumentOperation.InstrumentStatusID = InstrumentStatus.Id
) WHERE InstrumentOperation.InstrumentStatusId != (SELECT Id FROM InstrumentStatus WHERE InstrumentStatus.Name = "ACTIVE");

我得到的错误是 `Subquery returns more than 1 row` .
2uluyalo

2uluyalo1#

如果我正确地遵循这个逻辑,你只需要 join 将表放在一起并设置相应的键:

update InstrumentOperation io join
       InstrumentStatus ins
       on io.InstrumentStatusId = ins.id join
       InstrumentStatusDataKey isd
       on isd.name = ins.name
    set StatusDataKeyId = isd.id;

相关问题