我正在努力解决Laravel Eloquent查询中的SQL语法问题。所以我回到了root,并尝试使用简单的SQL进行查询。而且我很难过。我不是专家,但这让我感到困惑。
我看过Update with Join in SQLite帖子,但我认为更多的是关于连接问题。
我在SQLLite上测试它,这肯定代表SQL本身?
两个表:指令和知识。我想从(最新的)指令更新Knowns中的一列。做对了,我可以自己解决其余的问题(我希望!)。
-- This works fine
Select instructions.rowid from instructions
where instructions.EngagementTitle not null
-- This doesn't
UPDATE knowns
SET EngagementTitle = instructions.EngagementTitle
WHERE id IN (
SELECT knowns.id
FROM knowns
INNER JOIN instructions
ON knowns.reference = instructions.reference
)
错误消息
no such column: instructions.EngagementTitle:
UPDATE knowns
SET EngagementTitle = instructions.EngagementTitle
WHERE id IN (
SELECT knowns.id
FROM knowns
LEFT JOIN instructions
ON knowns.reference = instructions.reference
)
两个表都有列 - 三重检查。
`EngagementTitle` varchar NOT NULL
我错过了什么?
答案 0 :(得分:0)
UPDATE knowns
SET EngagementTitle = instructions.EngagementTitle
...
instructions
表在此处未“知道”,仅knowns
。表表达式的范围仅为“向下”。您可以在子查询中使用在超级查询中引入的表,但不能反过来。
尝试使用子选择:
UPDATE knowns
SET engagementtitle = (SELECT instructions.engagementtitle
FROM instructions
WHERE instructions.reference = knowns.reference)
WHERE EXISTS (SELECT *
FROM instructions
WHERE instructions.reference = knowns.reference);
我还将WHERE
替换为EXISTS
。我想这就是你真正想要它的方式。它只会更新knowns
中instructions
中存在条目的行。你在LEFT JOIN
的子查询中使用IN
的方式,你刚刚更新了所有行,因为LEFT JOIN
包含左表中的所有行,因此所有ID都来自knowns
在结果中(您可能需要一个INNER JOIN
,这本来有用。)。
但请注意,instructions
中knowns
中的一行必须只有一个条目才能生效。我默默地认为情况确实如此。