development

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

big-blog 2020. 2. 16. 20:40
반응형

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 

트라 아! 잘 작동합니다!

위의 이해를 통해 작업을 수행하기 위해 설정된 필드와 "설정"기준을 수정할 수 있습니다. 검사를 수행 한 다음 임시 테이블로 데이터를 가져온 다음 테이블과 열 이름을 바꾸는 위의 구문을 사용하여 업데이트를 실행할 수도 있습니다.

알려주지 않으면 작동하기를 바랍니다. 나는 당신을 위해 정확한 쿼리를 작성합니다.


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, 즉 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에 통합하기에는 너무 복잡하다는 것을 알았습니다. 따라서 임시 테이블을 만들고 update 문으로 결합했습니다.

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


아래 쿼리로 확인하십시오.

업데이트 테이블 A A.name_a = B.name_b의 내부 조인 테이블 B B 유효성 검사 확인 = if (start_dts> end_dts, 'VALID', '')

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



반응형