it-swarm.com.de

MySQL - UPDATE-Abfrage basierend auf SELECT-Abfrage

Ich muss (aus derselben Tabelle) prüfen, ob zwei Ereignisse auf der Grundlage von Datum und Uhrzeit zusammenhängen.

Ein Datensatz enthält das Enddatum und die Uhrzeit bestimmter Ereignisse, der andere Datensatz enthält den Starttermin für andere Ereignisse.

Wenn das erste Ereignis vor dem zweiten Ereignis abgeschlossen ist, möchte ich sie verbinden.

Was ich bisher habe, ist:

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

Dann schließe ich mich ihnen an:

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

Kann ich dann basierend auf meinem validation_check-Feld eine UPDATE-Abfrage mit dem geschachtelten SELECT ausführen?

413
John M

Sie können dies auf zwei Arten tun:

MySQL-Update-Join-Syntax:

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-Syntax:

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)

Wählen Sie aus, was Ihnen am natürlichsten erscheint.

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

Hoffe, das funktioniert für dich.

251
massquote

Einfach in MySQL:

UPDATE users AS U1, users AS U2 
SET U1.name_one = U2.name_colX
WHERE U2.user_id = U1.user_id
87
Sergio

Wenn jemand versucht, Daten von einer Datenbank in eine andere zu aktualisieren, unabhängig davon, auf welche Tabelle sie abzielen, müssen einige Kriterien dafür erfüllt sein.

Dieser ist für alle Levels besser und sauberer:

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! Es funktioniert super!

Mit dem obigen Verständnis können Sie die gesetzten Felder und die Aktivierungskriterien für Ihre Arbeit ändern. Sie können auch die Prüfungen durchführen, die Daten in die temporären Tabellen ziehen und dann das Update mit der obigen Syntax ausführen, um Ihre Tabellen- und Spaltennamen zu ersetzen. 

Ich hoffe, es funktioniert, wenn Sie mich nicht wissen lassen. Ich werde eine genaue Anfrage für Sie schreiben.

46
KMX
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 ;

Ich hoffe, dies hilft Ihnen in einem Fall, in dem Sie zwei Tabellen miteinander vergleichen und aktualisieren müssen.

11
Don

Ich habe diese Frage gefunden, als ich nach einer eigenen Lösung für ein sehr komplexes Join gesucht habe. Dies ist eine alternative Lösung zu einer komplexeren Version des Problems, von der ich dachte, dass sie nützlich sein könnte. 

Ich musste das Feld product_id in der Aktivitätstabelle auffüllen, in dem Aktivitäten in einer Einheit nummeriert sind und Einheiten in einer Ebene nummeriert sind (durch eine Zeichenfolge ?? N identifiziert), sodass man Aktivitäten anhand einer SKU (L1U1A1) identifizieren kann. Diese SKUs werden dann in einer anderen Tabelle gespeichert. 

Ich habe Folgendes identifiziert, um eine Liste von activity_id vs. product_id zu erhalten: -

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)

Ich fand, dass das zu komplex war, um es in ein SELECT in mysql zu integrieren, also erstellte ich eine temporäre Tabelle und verband diese mit der update-Anweisung: -

CREATE TEMPORARY TABLE activity_product_ids AS (<the above select statement>);

UPDATE activities a
  JOIN activity_product_ids b
    ON a.activity_id=b.activity_id 
  SET a.product_id=b.product_id;

Ich hoffe jemand findet das nützlich

11
sibaz
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];
6
bhavik

Sie können Werte aus einer anderen Tabelle mithilfe des inneren Joins aktualisieren

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];

Folgen Sie hier, um zu erfahren, wie Sie diese Abfrage verwenden. http://www.voidtricks.com/mysql-inner-join-update/

oder Sie können select als Unterabfrage verwenden

UPDATE [table_name] SET [column_name] = (SELECT [column_name] FROM [table_name] WHERE [column_name] = [value]) WHERE [column_name] = [value];

abfrage hier ausführlich erläutert http://www.voidtricks.com/mysql-update-from-select/

4
Anand Roshan

Sie können verwenden:

UPDATE Station AS st1, StationOld AS st2
   SET st1.already_used = 1
 WHERE st1.code = st2.code
3
SergeyUr

Für denselben Tisch

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;
3
Gnanam pragasam

Ich hatte ein Problem mit doppelten Einträgen in einer Tabelle. Im Folgenden haben die Ansätze für mich gearbeitet. Es wurde auch von @sibaz befürwortet.

Zum Schluss habe ich es mit den folgenden Abfragen gelöst:

  1. Die Auswahlabfrage wird in einer temporären Tabelle gespeichert

    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;
    
  2. Die temporäre Tabelle wird in der Aktualisierungsabfrage verknüpft.

    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
    )
    

Ich habe nicht viel Erfahrung mit SQL.

Die obigen Abfragen betreffen den MySql-Server.

1
Rick

Prüfen Sie die Abfrage unten.

update tableA A Inner Join tableB B auf A.name_a = B.name_b set validation_check = if (start_dts> end_dts, 'VALID', '')  

0
Anoop Kumar