我需要检查(从同一个表中)两个事件之间是否存在基于日期-时间的关联。

一组数据将包含某些事件的结束日期-时间,另一组数据将包含其他事件的开始日期-时间。

如果第一个事件在第二个事件之前完成,那么我想把它们联系起来。

到目前为止,我有:

SELECT name as name_A, date-time as end_DTS, id as id_A 
FROM tableA WHERE criteria = 1


SELECT name as name_B, date-time as start_DTS, id as id_B 
FROM tableA WHERE criteria = 2

然后我加入他们:

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

然后,我可以根据validation_check字段运行一个带有SELECT嵌套的UPDATE查询吗?


当前回答

UPDATE [table_name] AS T1,
      (SELECT [column_name] 
        FROM [table_name] 
        WHERE [column_name] = [value]) AS T2 
  SET T1.[column_name]=T2.[column_name] + 1
WHERE T1.[column_name] = [value];

其他回答

实际上你有两种方法:

MySQL更新连接语法:

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语法:

UPDATE tableA SET validation_check = 
    (SELECT if(start_DTS > end_DTS, 'VALID', '') AS validation_check
        FROM tableA
        INNER JOIN tableB ON name_A = name_B
        WHERE id_A = tableA.id_A)

挑一个对你来说最自然的。

如果有人试图将数据从一个数据库更新到另一个数据库,而不管他们的目标是哪个表,那么必须有一些标准来做到这一点。

这个对所有关卡来说都更好更干净:

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 

Traaa !效果很好!

有了以上的理解,您就可以修改设置的字段和“on”标准来完成您的工作。您还可以执行检查,然后将数据拉入临时表,然后使用替换表和列名的上述语法运行更新。

希望有用,如果不行请告诉我。我会为你写一个精确的查询。

UPDATE
    `table1` AS `dest`,
    (
        SELECT
            *
        FROM
            `table2`
        WHERE
            `id` = x
    ) AS `src`
SET
    `dest`.`col1` = `src`.`col1`
WHERE
    `dest`.`id` = x
;

希望这对你有用。

我有一个重复的条目在一个表本身的问题。以下是对我有效的方法。@sibaz也提倡这样做。

最后我用下面的查询解决了这个问题:

The select query is saved in a temp table 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; The temp table is joined in the update query. 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服务器的。

UPDATE [table_name] AS T1,
      (SELECT [column_name] 
        FROM [table_name] 
        WHERE [column_name] = [value]) AS T2 
  SET T1.[column_name]=T2.[column_name] + 1
WHERE T1.[column_name] = [value];