我试图用另一个表中的数据更新表,两个表之间的关系, 是一对多的关系。我在这里找到了一个例子:
UPDATE
foo f
INNER JOIN
bar b
ON
b.fooId = f.Id
SET
f.something1 = b.barSome1,
f.something2 = b.barSome1,
f.something3 = b.barSome1,
f.something4 = b.barSome1
但我的例子只带我一半, 我想要做的是根据最新的选择前1个栏 bar.post_date或bar.Id或检查bar.barSome1(假设它的varchar)是null还是空。
现在它是我酒吧的一些内部订单
答案 0 :(得分:0)
因此,您需要添加WHERE
子句来限制修改foo
行。
UPDATE
foo f
INNER JOIN
bar b
ON
b.fooId = f.Id
SET
f.something1 = b.barSome1,
f.something2 = b.barSome1,
f.something3 = b.barSome1,
f.something4 = b.barSome1
WHERE
/* only the latest foo.Id */
f.Id = (SELECT MAX(Id) FROM foo)
/* Or f.barSome1 is NULL or an empty string */
OR (f.barSome1 IS NULL OR f.barSome1 = '')
要通过最新post_date
执行此操作,请使用以下构造:
WHERE
f.id = (SELECT id FROM (SELECT id, post_date FROM foo HAVING post_date = MAX(post_date)) AS maxpost)
OR (f.barSome1 IS NULL OR f.barSome1 = '')
要从foo
的单行修改具有匹配条件的bar
的所有行,您可以对不带ON
子句的子查询使用连接。首先使用SELECT语句测试它。 我从来没有尝试过这样的事情,如果它破坏你的foo
表,则不承担任何责任。 :)先备份。
SELECT f.*, barsub.*
FROM
foo f
JOIN (SELECT * FROM bar WHERE Id = (SELECT MAX(Id) FROM bar)) barsub
UPDATE foo f
/* subquery returns one row so all rows of foo are joined to it */
JOIN (SELECT * FROM bar WHERE Id = (SELECT MAX(Id) FROM bar)) barsub
/* no ON clause */
SET
f.something1 = barsub.barSome1,
f.something2 = barsub.barSome1,
f.something3 = barsub.barSome1,
f.something4 = barsub.barSome1