MySQL – UPDATE-query op basis van SELECT-query

Ik moet controleren (van dezelfde tabel) of er een verband is tussen twee gebeurtenissen op basis van datum-tijd.

De ene set gegevens bevat de einddatum-tijd van bepaalde evenementen en de andere set gegevens bevat de begindatum-tijd voor andere evenementen.

Als het eerste evenement vóór het tweede evenement is voltooid, wil ik ze graag koppelen.

Wat ik tot nu toe heb is:

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

Dan sluit ik me bij hen aan:

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

Kan ik dan, op basis van mijn validation_check-veld, een UPDATE-query uitvoeren met de SELECT genest?


Antwoord 1, autoriteit 100%

Je kunt dit op twee manieren doen:

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

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)

Kies wat je het meest natuurlijk lijkt.


Antwoord 2, autoriteit 39%

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

Ik hoop dat dit voor u werkt.


Antwoord 3, autoriteit 15%

Eenvoudig in MySQL:

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

Antwoord 4, autoriteit 7%

Als iemand gegevens van de ene database naar de andere wil bijwerken, ongeacht op welke tabel ze zich richten, moeten er enkele criteria zijn om dit te doen.

Deze is beter en schoon voor alle niveaus:

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 

Traa! Het werkt geweldig!

Met het bovenstaande begrip kunt u de ingestelde velden en “aan”-criteria aanpassen om uw werk te doen. U kunt ook de controles uitvoeren, vervolgens de gegevens naar de tijdelijke tabel(len) halen en vervolgens de update uitvoeren met behulp van de bovenstaande syntaxis die uw tabel- en kolomnamen vervangt.

Ik hoop dat het werkt, zo niet, laat het me weten. Ik zal een exacte vraag voor je schrijven.


Antwoord 5, autoriteit 3%

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 ;

Ik hoop dat dit u zal helpen in een geval waar u moet matchen en bijwerken tussen twee tabellen.


Antwoord 6, Autoriteit 2%

Ik heb deze vraag gevonden bij het zoeken naar mijn eigen oplossing voor een zeer complexe join. Dit is een alternatieve oplossing, tot een complexere versie van het probleem, dat ik dacht dat het nuttig zou kunnen zijn.

Ik moest het veld Product_ID in de Activatietabel vullen, waar activiteiten in een eenheid zijn genummerd en eenheden zijn genummerd in een niveau (geïdentificeerd met behulp van een string ?? N), zodanig dat men activiteiten kan identificeren met behulp van een SKU IE L1u1a1. Die Skus worden vervolgens opgeslagen in een andere tabel.

Ik heb het volgende geïdentificeerd om een ​​lijst met Activity_ID vs product_id te krijgen: –

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)

Ik vond dat dat te complex was om in een Select in MySQL op te nemen, dus ik heb een tijdelijke tabel gemaakt en verbonden met de update-instructie: –

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;

Ik hoop dat iemand dit handig vindt


Antwoord 7

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

Antwoord 8

U kunt waarden bijwerken van een andere tabel met behulp van innerlijke toetsing zoals deze

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

Volg hier om te weten hoe u deze query gebruikt http: //www.voidtricks. com / mysql-innerlijke join-update /

of u kunt selecteren als subquery om dit te doen

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

Query uitgelegd in details hier http://www.voidtricks.com/mysql- update-from-select /


Antwoord 9

U kunt gebruiken:

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

Antwoord 10

Voor dezelfde tabel,

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;

Antwoord 11

Ik had een probleem met dubbele vermeldingen in één tabel zelf. Hieronder is de aanpak werkte voor mij. Het is ook bepleit door @sibaz.

Eindelijk heb ik het opgelost met behulp van de onderstaande vragen:

  1. De selectiequery wordt opgeslagen in een tijdelijke tabel

    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. De tijdelijke tabel wordt toegevoegd aan de 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
    )
    

Ik heb niet veel ervaring met SQL, adviseer alstublieft een betere aanpak die u kent.

Bovenstaande zoekopdrachten zijn voor MySql-server.


Antwoord 12

als u een update uitvoert vanuit een complexe query. Het beste is om een tijdelijke tabel van de query te maken en vervolgens de tijdelijke tabel te gebruiken om als één query bij te werken.

   DROP TABLE IF EXISTS cash_sales_sums;
CREATE TEMPORARY TABLE cash_sales_sums as
SELECT tbl_cash_sales_documents.batch_key, COUNT(DISTINCT tbl_cash_sales_documents.cash_sale_number) no_of_docs,
  SUM(tbl_cash_sales_documents.paid_amount) paid_amount, SUM(A.amount - tbl_cash_sales_documents.bonus_amount - tbl_cash_sales_documents.discount_given) amount,
  SUM(A.recs) no_of_entries FROM 
        tbl_cash_sales_documents
    RIGHT JOIN(
        SELECT
            SUM(
                tbl_cash_sales_transactions.amount
            )amount,
            tbl_cash_sales_transactions.cash_sale_document_id,
            COUNT(transaction_id)recs
        FROM
            tbl_cash_sales_transactions
        GROUP BY
            tbl_cash_sales_transactions.cash_sale_document_id
    )A ON A.cash_sale_document_id = tbl_cash_sales_documents.cash_sale_id
    GROUP BY
        tbl_cash_sales_documents.batch_key
ORDER BY batch_key;
UPDATE tbl_cash_sales_batches SET control_totals = (SELECT amount FROM cash_sales_sums WHERE cash_sales_sums.batch_key = tbl_cash_sales_batches.batch_key LIMIT 1),
expected_number_of_documents = (SELECT no_of_docs FROM cash_sales_sums WHERE cash_sales_sums.batch_key = tbl_cash_sales_batches.batch_key),
computer_number_of_documents = expected_number_of_documents,  computer_total_amount = control_totals
WHERE batch_key IN (SELECT batch_key FROM cash_sales_sums);

Other episodes