我如何在 SQL 中使用 Substring 进行更新?
How I can use Substring for Update in SQL right?
我在 SQL 中再次遇到问题。我想将子字符串用于 SELECT 查询,用于 table 更新。查询如下所示:
SELECT SUBSTRING(h.action,LOCATE('"',h.action)+1,(((LENGTH(h.action))-LOCATE('"', REVERSE(h.action))-1)-LOCATE('"',h.action))) AS File,
h.TIMESTAMP,
h.user,
d.uid,
d.size
d.id
from history h
INNER JOIN data d ON h.contract = d.contract
LEFT JOIN history ON d.user = history.user
WHERE ( SELECT DISTINCT SUBSTRING(h.action,LOCATE('"',h.action)+1,(((LENGTH(h.action))-LOCATE('"', REVERSE(h.action))-1)-LOCATE('"',h.action)))) IN (SELECT filename FROM data)
and h.contract=xy AND h.action LIKE 'file%added' GROUP BY File
现在我想更新 table 数据。 'user' 列和 'Timestamp' 列将从 table 历史记录传输到数据。我最后一次尝试更新命令如下:
update data d
set
d.user = v.user,
d.upload= h.`timestamp`
inner join
history h on d.contract = h.contract
where
d.filename in (SELECT DISTINCT SUBSTRING(h.action,LOCATE('"',h.action)+1,(((LENGTH(h.action))-LOCATE('"', REVERSE(h.action))-1)-LOCATE('"',h.action)))) and h.action like 'File%added'
到目前为止我收到了一个语法错误,或者是一个 SQL 命令返回了 0 行需要修改。我希望这是一个容易解决的问题。
提前感谢您的帮助!
我不知道下面的查询是否有帮助,因为正如我在评论中提到的,您应该提供数据示例和预期结果。
正确的UPDATE语法是:
Single-table syntax:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference [PARTITION
(partition_list)] [FOR PORTION OF period FROM expr1 TO expr2] SET
col1={expr1|DEFAULT} [,col2={expr2|DEFAULT}] ... [WHERE
where_condition] [ORDER BY ...] [LIMIT row_count] Multiple-table
syntax:
UPDATE [LOW_PRIORITY] [IGNORE] table_references
SET col1={expr1|DEFAULT} [, col2={expr2|DEFAULT}] ...
[WHERE where_condition]
所以你的更新查询应该是:
update data d
inner join history h on d.contract = h.contract
set d.user = v.user, d.upload= h.`timestamp`
where d.filename in (SELECT DISTINCT SUBSTRING(h.action,LOCATE('"',h.action)+1,(((LENGTH(h.action))-LOCATE('"', REVERSE(h.action))-1)-LOCATE('"',h.action))))
and h.action like 'File%added' ;
我在 SQL 中再次遇到问题。我想将子字符串用于 SELECT 查询,用于 table 更新。查询如下所示:
SELECT SUBSTRING(h.action,LOCATE('"',h.action)+1,(((LENGTH(h.action))-LOCATE('"', REVERSE(h.action))-1)-LOCATE('"',h.action))) AS File,
h.TIMESTAMP,
h.user,
d.uid,
d.size
d.id
from history h
INNER JOIN data d ON h.contract = d.contract
LEFT JOIN history ON d.user = history.user
WHERE ( SELECT DISTINCT SUBSTRING(h.action,LOCATE('"',h.action)+1,(((LENGTH(h.action))-LOCATE('"', REVERSE(h.action))-1)-LOCATE('"',h.action)))) IN (SELECT filename FROM data)
and h.contract=xy AND h.action LIKE 'file%added' GROUP BY File
现在我想更新 table 数据。 'user' 列和 'Timestamp' 列将从 table 历史记录传输到数据。我最后一次尝试更新命令如下:
update data d
set
d.user = v.user,
d.upload= h.`timestamp`
inner join
history h on d.contract = h.contract
where
d.filename in (SELECT DISTINCT SUBSTRING(h.action,LOCATE('"',h.action)+1,(((LENGTH(h.action))-LOCATE('"', REVERSE(h.action))-1)-LOCATE('"',h.action)))) and h.action like 'File%added'
到目前为止我收到了一个语法错误,或者是一个 SQL 命令返回了 0 行需要修改。我希望这是一个容易解决的问题。
提前感谢您的帮助!
我不知道下面的查询是否有帮助,因为正如我在评论中提到的,您应该提供数据示例和预期结果。
正确的UPDATE语法是:
Single-table syntax:
UPDATE [LOW_PRIORITY] [IGNORE] table_reference [PARTITION (partition_list)] [FOR PORTION OF period FROM expr1 TO expr2] SET col1={expr1|DEFAULT} [,col2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count] Multiple-table syntax:
UPDATE [LOW_PRIORITY] [IGNORE] table_references SET col1={expr1|DEFAULT} [, col2={expr2|DEFAULT}] ... [WHERE where_condition]
所以你的更新查询应该是:
update data d
inner join history h on d.contract = h.contract
set d.user = v.user, d.upload= h.`timestamp`
where d.filename in (SELECT DISTINCT SUBSTRING(h.action,LOCATE('"',h.action)+1,(((LENGTH(h.action))-LOCATE('"', REVERSE(h.action))-1)-LOCATE('"',h.action))))
and h.action like 'File%added' ;