programing

MySQL - SELECT 쿼리에 기반한 업데이트 쿼리

projobs 2022. 12. 10. 14:06
반응형

MySQL - SELECT 쿼리에 기반한 업데이트 쿼리

날짜 시간에 따라 두 이벤트 간에 연관성이 있는지 확인해야 합니다.

한 데이터 세트에는 특정 이벤트의 종료 날짜 시간이 포함되며 다른 데이터 세트에는 다른 이벤트의 시작 날짜 시간이 포함됩니다.

두 번째 이벤트 전에 첫 번째 이벤트가 완료된다면 링크하고 싶습니다.

지금까지 제가 아는 건

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 쿼리를 실행할 수 있습니까?

실제로는 다음 두 가지 방법 중 하나를 사용할 수 있습니다.

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
    `table1` AS `dest`,
    (
        SELECT
            *
        FROM
            `table2`
        WHERE
            `id` = x
    ) AS `src`
SET
    `dest`.`col1` = `src`.`col1`
WHERE
    `dest`.`id` = x
;

이게 너한테 효과가 있길 바라.

MySQL에서는 간단:

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

어떤 테이블을 대상으로 하든 데이터베이스 간에 데이터를 업데이트하려는 경우에는 어떤 기준이 있어야 합니다.

이 제품은 모든 레벨에서 더 우수하고 깨끗합니다.

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

두 테이블을 일치시키고 업데이트해야 하는 경우 이 방법이 도움이 되기를 바랍니다.

저는 매우 복잡한 결합에 대한 저만의 해결책을 찾다가 이 질문을 발견했습니다.이것은 좀 더 복잡한 버전의 문제에 대한 대안적인 해결책입니다. 저는 이것이 유용할 것이라고 생각했습니다.

액티비티 테이블에 product_id 필드를 입력해야 했습니다.액티비티는 단위로 번호가 매겨지고 단위는 레벨로 매겨집니다(문자열을 사용하여 식별).N)는 SKU ie L1U1A1을 사용하여 활동을 식별할 수 있도록 한다.그런 다음 이러한 SKU는 다른 테이블에 저장됩니다.

activity_id와 product_id의 목록을 얻기 위해 다음 사항을 확인했습니다.

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에 통합하기에는 너무 복잡하다는 것을 알고 임시 테이블을 만들어 업데이트 스테이트먼트에 참여했습니다.-

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;

누군가 이것을 유용하게 여겨주길 바란다.

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

내부 조인을 사용하여 다른 테이블의 값을 다음과 같이 업데이트할 수 있습니다.

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를 서브쿼리로 사용하여 이 작업을 수행할 수 있습니다.

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

자세한 내용은 이쪽 http://www.voidtricks.com/mysql-update-from-select/에서 확인하시기 바랍니다.

다음을 사용할 수 있습니다.

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

같은 테이블에 대해서

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;

테이블 자체에 중복된 엔트리가 있는 문제가 있었습니다.아래는 나에게 효과가 있었던 접근법이다.@sibaz도 지지하고 있습니다.

마지막으로 아래 질문으로 해결했습니다.

  1. 선택 쿼리가 임시 테이블에 저장됩니다.

    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. 임시 테이블이 업데이트 쿼리에 결합됩니다.

    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 서버에 대한 것입니다.

복잡한 쿼리에서 업데이트하는 경우.가장 좋은 방법은 쿼리에서 임시 테이블을 만든 다음 임시 테이블을 사용하여 하나의 쿼리로 업데이트하는 것입니다.

    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);
INSERT INTO all_table
SELECT Orders.OrderID,
    Orders.CustomerID,
    Orders.Amount,
    Orders.ProductID,
    Orders.Date,
    Customer.CustomerName,
    Customer.Address
FROM Orders
JOIN Customer ON Orders.CustomerID=Customer.CustomerID
WHERE Orders.OrderID not in (SELECT OrderID FROM all_table)

언급URL : https://stackoverflow.com/questions/1262786/mysql-update-query-based-on-select-query

반응형