>source

다음과 같은 두 개의 테이블이 있습니다 :

표 1

DataS DataH DataO
001    101    ABA
003    101    ABC
001    101    AAB
001    105    BBA
002    102    ABB
002    102    ACA

표 2

DataS DataH DataO Result1 Result2 Result3
003   101   ABC
001   105   BBA

두 개의 입력 매개 변수로 프로 시저를 작성하려고합니다 : @DataS @DataH . 수행 할 절차 :

  1. Table1 WHERE DataS=@DataS AND DataH=@DataH 에서 모든 레코드 선택 .
  2. 선택한 모든 행에 대해 표 3에 동일한 세 개의 값이있는 IF 레코드가 있는지 확인하십시오. [DataS]   [DataH]   [DataO] .
  3. 있는 경우-표 2에서이 행을 업데이트하십시오 (SET Result1 = (MyFunction), SET Result2 = (MyFunction) 등).
  4. IF 아니오-모든 매개 변수와 함께이 행을 삽입하십시오. [DataS] [DataH] [DataO] [Result1] [Result2] [Result3]

절차가 실행 된 후 Table2는 다음과 같아야합니다.

표 2 (업데이트 후)

DataS  DataH DataO Result1 Result2 Result3
003    101   ABC   1.5     1.3     1.4
001    105   BBA   1.6     1.1     1.3
001    101   ABA   1.6     1.3     1.4
001    101   AAB   1.6     1.3     1.4
002    102   ABB   1.1     1.4     1.4
002    102   ACA   1.3     1.4     1.1

한 번의 절차로 수행 할 수 있습니까? 좋은 효율성을 유지하는 가장 좋은 방법은 무엇입니까? cte로 할 수 있습니까, 아니면 더 나은 솔루션, 일부 루프 기능이 있습니까?

DECLARE @ID int
SELECT @ID = (SELECT ID FROM Table2 WHERE DataS=@DataS AND DataH=@DataH AND DataO=@DataO)
IF EXISTS @ID
BEGIN
    --UPDATE Table2 SET Result1=... WHERE ID=@ID
END
ELSE
BEGIN
   --INSERT INTO Table2 (.....)
END

업데이트 : Luis Cazares가 말한 것처럼 MERGE를 사용하는 것이 가장 좋은 해결책이라고 생각합니다. 감사합니다.

MERGE Table2 AS ex
USING x AS st
ON (x.DataS = st.DataSAND ex.DataO = st.DataO AND ex.DataH = st.DataH)
WHEN MATCHED THEN UPDATE SET ex.Result1 = 9
WHEN NOT MATCHED THEN
INSERT(DataS,DataH,DataO,Result1)
VALUES(st.DataS,st.DataH,st.DataO,9);

매우 똑똑해 보였지만 작동하지 않고 빨간색보다 MERGE가 내가 사용하는 이전 2005 SQL Server (2008에서 시작)를 지원하지 않습니다. mkRabbani가 제안한대로 CURSOR 기능을 시도하고 작동합니다 (감사합니다).


  • 답변 # 1

    이는 아래 정의 된 CURSOR를 사용하여 달성 할 수 있습니다. 테스트 값은 함수 출력으로 바꿔야합니다.

    DECLARE @DataS VARCHAR(50)
    DECLARE @DataH VARCHAR(50)
    SET @DataS  =  '003'
    SET @DataH = '101'
    DECLARE @DataS_T1 VARCHAR(50)
    DECLARE @DataH_T1 VARCHAR(50)
    DECLARE @DataO_T1 VARCHAR(50)
    DECLARE @DataS_T2 VARCHAR(50)
    DECLARE @DataH_T2 VARCHAR(50)
    DECLARE @DataO_T2 VARCHAR(50)
    DECLARE db_cursor CURSOR 
    FOR 
    SELECT 
    T1.DataH DataH_T1,T1.DataO DataO_T1,T1.DataS DataS_T1,
    T2.DataH DataH_T2,T2.DataO DataO_T2,T2.DataS DataS_T2  
    FROM Table1 T1
    LEFT JOIN Table2 T2
        ON T1.DataH = T2.DataH AND T1.DataO =T2.DataO AND T1.DataS = T2.DataS
    WHERE T1.DataH = @DataH
    AND T1.DataS = @DataS
    OPEN db_cursor  
    FETCH NEXT FROM db_cursor INTO @DataH_T1,@DataO_T1,@DataS_T1,@DataH_T2,@DataO_T2,@DataS_T2  
    WHILE @@FETCH_STATUS = 0  
    BEGIN  
          IF (@DataH_T2 IS NULL)
          BEGIN
              INSERT INTO Table2 (DataS,DataH,DataO,Result1,Result2,Result3)
              VALUES (@DataS_T1,@DataH_T1,@DataO_T1,'Test Result 1','Test Result 2','Test Result 3')
          END
          ELSE
          BEGIN
              UPDATE Table2
              SET Result1 = 'Test',
              Result2= 'test2',
              Result3= 'Test3'
              WHERE DataS = @DataS_T2 
              AND DataH = @DataH_T2
              AND DataO = @DataO_T2
          END
          FETCH NEXT FROM db_cursor INTO @DataH_T1,@DataO_T1,@DataS_T1,@DataH_T2,@DataO_T2,@DataS_T2  
    END 
    CLOSE db_cursor  
    DEALLOCATE db_cursor
    
    

관련 자료

  • 이전 Oracle Sql - oracle sql - 주문이 반복되는 열 id 당 한 줄씩 나열하여 주문이 둘 이상인 고객을 선택하십시오
  • 다음 cuda - 기본이 아닌 GPU를 사용할 때 cudaLaunchKernel에서 잘못된 리소스 핸들이 반환 됨