什么是正确的SQL语法?

时间:2018-06-05 00:45:36

标签: sql laravel sqlite

我正在努力解决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

我错过了什么?

1 个答案:

答案 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。我想这就是你真正想要它的方式。它只会更新knownsinstructions中存在条目的行。你在LEFT JOIN的子查询中使用IN的方式,你刚刚更新了所有行,因为LEFT JOIN包含左表中的所有行,因此所有ID都来自knowns在结果中(您可能需要一个INNER JOIN,这本来有用。)。

但请注意,instructionsknowns中的一行必须只有一个条目才能生效。我默默地认为情况确实如此。