SQL从视图

时间:2015-11-16 17:50:43

标签: mysql sql select vlookup

我是新手,所以我为任何困惑/挫折道歉。我感谢你能得到的任何帮助!

我有一个表( MainTable ),我用( GoodTable BadTable )创建了两个视图。

  • 每个表有4列( ID UserID )。
  • ID是主键,但
  • UserID可以重复多行。

我需要在表中执行的操作是找到 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指出我正确的方向!)

4 个答案:

答案 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中获得所需结果的整个过程(如发布的问题中所示):

  1. 创建 GoodTable 视图
  2. 创建 BadTable 视图
  3. 创建 MatchTable 视图
  4. 运行更新查询以更新 MainTable
  5. 疯狂地庆祝! (开玩笑 - 我不能帮助这种唠叨的感觉,必须有更好/更有效的方法来做到这一点!)但是,严肃地说,疯狂地庆祝
  6. (再次感谢@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

对此有点修正。对于你想要的密钥