MySQL - UPDATE query based on SELECT Query
我需要(从同一个表)检查基于日期时间的两个事件之间是否存在关联。
一组数据将包含特定事件的结束日期时间,另一组数据将包含其他事件的开始日期时间。
如果第一个事件在第二个事件之前完成,那么我想将它们链接起来。
到目前为止,我拥有的是:
然后我加入他们:
1 2 3 4
| SELECT name_A , name_B , id_A , id_B ,
if(start_DTS > end_DTS ,'VALID','') as validation_check
FROM tableA
LEFT JOIN tableB ON name_A = name_B |
然后,我可以基于我的验证检查字段,使用select嵌套运行更新查询吗?
- 我不知道你在问什么?您想知道如何使用SQL select进行更新吗?
实际上,您可以通过以下两种方式之一进行操作:
MySQL更新联接语法:
1 2 3 4
| UPDATE tableA a
INNER JOIN tableB b ON a.name_a = b.name_b
SET validation_check = if(start_dts > end_dts , 'VALID', '')
-- where clause can go here |
ANSI SQL语法:
选择你觉得最自然的。
- @埃里克,我是你的粉丝,因为第一个查询的IF条件更新字段。太好了,Yeppee。
- 谢谢你第一次来。而这个答案已经有7年多的历史了。我不相信为什么没有人说第二个在某些数据库(如mysql)中不起作用。你会得到这个错误:You can't specify target table ___ for update in FROM clause SQL.sql 。
- 另外,请注意,直到最近,当tableA=tableB时,第一种方法还不适用于mysql。您必须创建一个临时表来存储中间结果。(必须为迁移脚本编写类似的查询)
- 如果您可以在示例中添加一个WHERE子句,我相信这会帮助很多人,包括我自己。
- 为什么这是左联?它将在nulls上失败。哦,我可以编辑这个…好啊。现在它是一个内部连接
- 第一个表单(用join更新)将比第二个更高效。第一个将执行单个联接,而第二个将对表A的每一行执行SELECT查询。
- 对于第一个示例,您不应该使用内部联接吗?对于没有相应TableB记录的TableA记录,左联接是否会导致验证检查设置为空?
- @是的,发生在我身上。应该是内部连接!或者把它作为一个连接。如果没有内部联接,则左联接意味着将更新所有表A记录!这很危险!
希望这对你有用。
- 这是迄今为止最快的查询。编辑:dest有22k行,src有4k行,完成时间不到1秒,而最上面的答案超过60秒。
- 是的,这是最快的查询,顺便说一句,您也可以添加WHERE子句
- 最快并不总是意味着好的,这个更新在所有情况下都不起作用,事实上有些情况下你会有一个意想不到的行为,所有这一切都是为什么不放一个条件,那不是一个连接。
在MySQL中容易:
1 2 3
| UPDATE users AS U1 , users AS U2
SET U1.name_one = U2.name_colX
WHERE U2.user_id = U1.user_id |
如果有人试图将数据从一个数据库更新到另一个数据库,而不管目标是哪个表,都必须有一些条件来完成。
这是一个更好的和清洁的各级:
1 2 3 4 5 6 7 8 9
| UPDATE dbname1.content targetTable
LEFT JOIN dbname2.someothertable sourceTable ON
targetTable.compare_field = sourceTable.compare_field
SET
targetTable.col1 = sourceTable.cola ,
targetTable.col2 = sourceTable.colb ,
targetTable.col3 = sourceTable.colc ,
targetTable.col4 = sourceTable.cold |
特拉!很好用!
有了以上的理解,您可以修改设置字段和"打开"条件来完成您的工作。您还可以执行检查,然后将数据拉入临时表,然后使用上面的语法替换表名和列名运行更新。
希望它能起作用,如果不让我知道的话。我会给你写一个确切的问题。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| UPDATE
receipt_invoices dest ,
(
SELECT
`receipt_id`,
CAST ((net * 100) / 112 AS DECIMAL (11, 2)) witoutvat
FROM
receipt
WHERE CAST ((net * 100) / 112 AS DECIMAL (11, 2)) != total
AND vat_percentage = 12
) src
SET
dest.price = src.witoutvat ,
dest.amount = src.witoutvat
WHERE col_tobefixed = 1
AND dest. `receipt_id` = src.receipt_id ; |
希望这能帮助您在两个表之间进行匹配和更新。
我在寻找一个非常复杂的连接的解决方案时发现了这个问题。对于更复杂的问题,这是另一种解决方案,我认为这可能有用。
我需要填充Activities表中的Product_id字段,其中Activities在一个单元中编号,Units在一个级别中编号(使用字符串标识)??n),这样就可以使用sku ie l1u1a1识别活动。然后将这些SKU存储在不同的表中。
我确定了以下内容以获取活动ID与产品ID的列表:
1 2 3 4 5 6
| SELECT a.activity_id , w.product_id
FROM activities a
JOIN units USING(unit_id )
JOIN product_types USING(product_type_id )
JOIN web_products w
ON sku =CONCAT('L',SUBSTR (product_type_code ,3), 'U',unit_index , 'A',activity_index ) |
我发现这太复杂了,无法合并到MySQL中的select中,因此我创建了一个临时表,并将其与update语句连接起来:
我希望有人觉得这个有用
您可以使用这样的内部联接从另一个表更新值
1
| UPDATE [table1_name ] AS t1 INNER JOIN [table2_name ] AS t2 ON t1.column1_name ] = t2. [column1_name ] SET t1. [column2_name ] = t2.column2_name ]; |
请遵循此处了解如何使用此查询http://www.voidtricks.com/mysql-inner-join-update/
或者可以使用select作为子查询来执行此操作
查询在这里详细解释http://www.voidtricks.com/mysql-update-from-select/
对于同一张桌子,
1 2 3 4 5 6 7
| UPDATE PHA_BILL_SEGMENT AS PHA ,
(SELECT BILL_ID , COUNT(REGISTRATION_NUMBER ) AS REG
FROM PHA_BILL_SEGMENT
GROUP BY REGISTRATION_NUMBER , BILL_DATE , BILL_AMOUNT
HAVING REG > 1) T
SET PHA.BILL_DATE = PHA.BILL_DATE + 2
WHERE PHA.BILL_ID = T.BILL_ID ; |
你可以使用:
1 2 3
| UPDATE Station AS st1 , StationOld AS st2
SET st1.already_used = 1
WHERE st1.code = st2.code |
检查下面的查询。
更新表Aa.name_a=b.name_b上的内部联接表b设置validation_check=if(start_dts>end_dts,'valid','')
我在一个表中遇到了重复条目的问题。下面是我的方法。它也被@sibaz所倡导。
最后,我使用以下查询解决了它:
选择查询保存在临时表中
1 2 3 4 5 6 7 8 9 10 11 12 13
| IF OBJECT_ID (N 'tempdb..#New_format_donor_temp', N 'U') IS NOT NULL
DROP TABLE #New_format_donor_temp;
select *
into #New_format_donor_temp
from DONOR_EMPLOYMENTS
where DONOR_ID IN (
1, 2
)
-- Test New_format_donor_temp
-- SELECT *
-- FROM #New_format_donor_temp; |
临时表已加入到更新查询中。
1 2 3 4 5 6 7 8
| UPDATE de
SET STATUS_CD =de_new.STATUS_CD , STATUS_REASON_CD =de_new.STATUS_REASON_CD , TYPE_CD =de_new.TYPE_CD
FROM DONOR_EMPLOYMENTS AS de
INNER JOIN #New_format_donor_temp AS de_new ON de_new.EMP_NO = de.EMP_NO
WHERE
de.DONOR_ID IN (
3, 4
) |
我对SQL没有太多经验,请建议您知道的更好的方法。
上面的查询是针对mysql服务器的。