【问题标题】:What is the correct SQL Syntax?什么是正确的 SQL 语法?
【发布时间】:2018-11-14 09:04:44
【问题描述】:

我正在努力解决 Laravel Eloquent 查询中的 SQL 语法问题。所以我回到了根目录,并试图让一个查询在简单的 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

我错过了什么?

【问题讨论】:

  • 如果sqllite支持update from join,你需要一个JOIN
  • 在您的子查询之外,instructions 未定义。我认为您正在寻找带有连接的UPDATE,但我不确定 SQLite 是否支持 MySQL 那样的语法
  • 我认为这个问题的焦点是关于 JOIN 关系的细节

标签: sql laravel sqlite


【解决方案1】:
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 JOININ,你刚刚更新了所有行,因为LEFT JOIN 包括左表中的所有行,因此来自knowns 的所有ID 都在结果(您可能想要一个INNER JOIN,这会起作用。)。

但请注意,instructions 中的一行不得超过一个条目,knowns 中的一行才能正常工作。我默默地假设是这样的。

【讨论】:

  • 谢谢你,说真的..这一直困扰着我,我一直想知道整个“向下”的事情,尽管你表达得比我更好。是的,一条指令 = 一条已知是正确的。非常感谢。
猜你喜欢
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
  • 2014-04-19
相关资源
最近更新 更多