在逗号分隔的字段中更新一个 table 中存在于另一个 table 中的寄存器的记录
Update records in one table for register present in another table, in a comma separated field
我有两个 table:
第一个表:
code store sent
1000002 Store1 0
1000002 Store2 0
1000002 Store3 0
第二张表:
code stores
1000002 Store1,Store3
我想做的是为特定代码更新 FirstTable.sent,仅针对 SecondTable.stores[ 中存在的记录=37=]
我有一个过程,它接受一个字符串和一个分隔符并从该字符串构建一个结果集。
例如,如果我进行以下调用:
call sp_csv_as_resultset("A,B,C,D", ",");
我得到以下输出作为结果集:
A
B
C
D
我在下一个更新语句中做了那个程序,目的是实现我需要的:
update FirstTable ft
inner join et_sap_magento_store_ids_removals_IF st
on ft.code = st.code
set ft.sent = 1
and ft.sent = 0
and ft.store in (sp_csv_as_resultset(st.stores, ','));
但是如您所知,您不能在 select.
中调用存储过程
我认为一个函数不能满足我的需求,因为它不能 return 一个 table 或一个结果集。有没有一种方法可以在不更改设计的情况下满足我的需求?
你能做到吗:
UPDATE first_table ft
INNER JOIN second_table st
ON ft.code=st.code
AND st.store LIKE CONCAT('%', ft.store ,'%')
SET ft.sent = 1
MySQL 有一个名为 FIND_IN_SET() 的函数可以提供帮助。
UPDATE FirstTable AS f
JOIN SecondTable AS s
ON f.code = s.code AND FIND_IN_SET(f.store, stores)
SET f.sent =1
WHERE f.sent = 0;
但是,请注意 FIND_IN_SET() 不能使用索引。在你的情况下,至少连接可以在 code
上使用索引,但在这些匹配中它必须以困难的方式进行扫描。
Stack Overflow 上有很多关于连接逗号分隔字符串的问题。我找不到提到更新查询的问题,否则我会投票决定将您的问题作为重复问题关闭。
当您知道需要在 SQL 条件下引用该列表中的单个条目时,更好的答案是避免存储逗号分隔的字符串。请参阅我对 Is storing a delimited list in a database column really that bad?
的回答
我有两个 table:
第一个表:
code store sent
1000002 Store1 0
1000002 Store2 0
1000002 Store3 0
第二张表:
code stores
1000002 Store1,Store3
我想做的是为特定代码更新 FirstTable.sent,仅针对 SecondTable.stores[ 中存在的记录=37=]
我有一个过程,它接受一个字符串和一个分隔符并从该字符串构建一个结果集。 例如,如果我进行以下调用:
call sp_csv_as_resultset("A,B,C,D", ",");
我得到以下输出作为结果集:
A
B
C
D
我在下一个更新语句中做了那个程序,目的是实现我需要的:
update FirstTable ft
inner join et_sap_magento_store_ids_removals_IF st
on ft.code = st.code
set ft.sent = 1
and ft.sent = 0
and ft.store in (sp_csv_as_resultset(st.stores, ','));
但是如您所知,您不能在 select.
中调用存储过程我认为一个函数不能满足我的需求,因为它不能 return 一个 table 或一个结果集。有没有一种方法可以在不更改设计的情况下满足我的需求?
你能做到吗:
UPDATE first_table ft
INNER JOIN second_table st
ON ft.code=st.code
AND st.store LIKE CONCAT('%', ft.store ,'%')
SET ft.sent = 1
MySQL 有一个名为 FIND_IN_SET() 的函数可以提供帮助。
UPDATE FirstTable AS f
JOIN SecondTable AS s
ON f.code = s.code AND FIND_IN_SET(f.store, stores)
SET f.sent =1
WHERE f.sent = 0;
但是,请注意 FIND_IN_SET() 不能使用索引。在你的情况下,至少连接可以在 code
上使用索引,但在这些匹配中它必须以困难的方式进行扫描。
Stack Overflow 上有很多关于连接逗号分隔字符串的问题。我找不到提到更新查询的问题,否则我会投票决定将您的问题作为重复问题关闭。
当您知道需要在 SQL 条件下引用该列表中的单个条目时,更好的答案是避免存储逗号分隔的字符串。请参阅我对 Is storing a delimited list in a database column really that bad?
的回答