我是新手,所以我为任何困惑/挫折道歉。我感谢你能得到的任何帮助!
我有一个表( MainTable ),我用( GoodTable 和 BadTable )创建了两个视图。
我需要在主表中执行的操作是找到 BAD 表中的 ID ,并更新 GOOD 表的值列,基于 UserID AND 匹配 LIKE匹配>键列,进入 MAIN 表。
我希望这是有道理的。
我试过了:
UPDATE MainTable
SET value = (SELECT value FROM GoodTable
WHERE MainTable.UserID = GoodTable.UserID
AND MainTable.key LIKE "some%key%specifics");
这让我几乎没有,但问题是如果它找不到LIKE键细节,它会返回一个NULL值,如果它不在BadTable中,我希望它保持原始值(BadTable基本上都是与LIKE键细节匹配的键)。显然上面没有使用BadTable,但我认为这可能有助于我解决这个问题(不是这样,到目前为止!)......
这是一个例子:
MainTable:
ID UserID key value
1 1 key1 good value
2 1 key2 bad value
3 1 key3 unrelated value
4 2 key1 good value
5 2 key2 bad value
6 2 key3 unrelated value
GoodTable:
ID UserID key value
1 1 key1 good value
4 2 key1 good value
BadTable:
ID UserID key value
2 1 key2 bad value
5 2 key2 bad value
What I want MainTable to change to:
ID UserID key value
1 1 key1 good value
2 1 key2 good value
3 1 key3 unrelated value
4 2 key1 good value
5 2 key2 good value
6 2 key3 unrelated value
我还想过,如果有类似VLOOKUP的东西(比如在Excel中)我可以说如果做错了该怎么做,但我也无法解决这个问题。我从研究其他问题尝试了一些其他的事情,但我现在让自己晕了,并决定伸出援助之手:)
最后,我不确定这是否重要,但这对于MySQL来说......
我确信我让自己变得比我需要的更复杂,所以我非常感谢任何人都可以提供帮助!
UPDATE :根据@Rabbit建议,这是我用内连接最好的方法(虽然我认为这会添加到MainTable,但我想保留行数在MainTable中,只需更新适用行的一个字段..):
UPDATE MainTable
JOIN GoodTable ON MainTable.ID = GoodTable.ID
SET value = (SELECT value FROM GoodTable
WHERE MainTable.UserID = GoodTable.UserID
AND MainTable.key LIKE "some%key%specifics");
我确信这是一次可怕的尝试,但我肯定是新手!
我确实设法提出了一个解决方案(虽然我确信这是非常低效的) - 请参阅下面的答案! (感谢@DBug和@Rabbit指出我正确的方向!)
答案 0 :(得分:3)
您可以使用Coalesce函数,该函数返回第一个非null参数,从两个表中为其赋予值列,例如
UPDATE MainTable
SET value = (SELECT COALESCE(GoodTable.value, MainTable.value) FROM GoodTable
WHERE MainTable.UserID = GoodTable.UserID
AND MainTable.key LIKE "some%key%specifics");
如果它不是NULL,它将返回GoodTable.value,如果是,则返回MainTable.value。
答案 1 :(得分:0)
无需使用子查询,可以在UPDATE子句中使用连接。
UPDATE Table1
INNER JOIN Table2 ON Table1.FieldName = Table2.FieldName
SET ....
WHERE ....
答案 2 :(得分:0)
这最终为我工作,但请注意我需要创建另一个视图( MatchTable ):
UPDATE MainTable
SET value = COALESCE((SELECT value FROM MatchTable
WHERE MainTable.ID = MatchTable.ID
AND MainTable.key LIKE "some%key%specifics"),(SELECT value));
MatchTable 主要是使用 GoodTable 中的BOD行(来自 BadTable )并使用GOOD值更新其值 。这是我用于此的代码:
CREATE VIEW MatchTable AS
SELECT (BadTable.ID) AS "ID", (BadTable.UserID) AS "UserID", (BadTable.key) AS "key", (SELECT value FROM GoodTable
WHERE BadTable.UserID = GoodTable.UserID) AS "value"
FROM BadTable
LEFT JOIN GoodTable
ON GoodTable.ID = BadTable.ID;
这导致 MatchTable :
中的以下数据MainTable:
ID UserID key value
2 1 key2 good value
5 2 key2 good value
为了完整解决方案,如果碰巧帮助其他人,以下是我用来分别创建 GoodTable 和 BadTable 的查询:
CREATE VIEW GoodTable AS
SELECT * FROM MainTable
WHERE key = "specific_key_term";
CREATE VIEW BadTable AS
SELECT * FROM MainTable
WHERE key LIKE "some%key%specifics";
好的,总结一下,这是我用来在MainTable中获得所需结果的整个过程(如发布的问题中所示):
(再次感谢@DBug让我在正确的轨道上获取更新部分,再次感谢@Rabbit让我进入MatchTable!)
答案 3 :(得分:0)
您已经说过" 主表找到BAD表中的ID,并根据UserID和A的匹配更新GOOD表的值列中的值LIKE与键列匹配,进入MAIN表。"所以你的样本结果是错误的......
我们将从MainTable更新2和5 ID吗?因为它在BadTable 但是 2和5键是键2 并且GoodTable上没有键2。
如果我会根据你的答案。这可能对你有帮助。请检查
UPDATE MainTable m
INNER JOIN BadTable b ON m.id = b.id
LEFT JOIN GoodTable g ON b.UserID = g.UserID
SET m.value = g.value
对此有点修正。对于你想要的密钥