2009-08-13 2 views
0

이런 종류의 저장 프로 시저가 가능한지 알고 싶습니다. 어떤 종류의 루핑 구조가 필요합니까? 기본적으로 다음 순서로이 작업을 수행하려고합니다.선택, 조건, 변수를 설정 한 다음 테이블에 삽입/업데이트하는 저장 프로 시저

  1. 하나의 테이블이나 뷰에서 모든 행을 가져옵니다. (table1)
  2. 표 1의 열을 기준으로 삽입/업데이트 table2에 사용할 변수를 설정하고 싶습니다.
  3. 다른 테이블 (table3)을 참조하여 table1에서 키를 찾으면 "무시"되며 행 데이터가 들어갈 수 있습니다.
  4. 표 2를 삽입하거나 업데이트하십시오.

가능하다면 답변에 임시 답변을 올리시겠습니까? 읽어 주셔서 감사합니다. PLZ 도와주세요! 는 여기에 또 다른 종류의-의의 "다이어그램"내가 무엇을 생각하고의 :..

  1. 선택 * 표에서
  2. 경우 [표 1] [table1column] - [표 1] [table1column] < = 0, 매개 변수 1 = "a"(많은 경우)
  3. case [table1]. [tableID] 존재 함 table3, parameter1 = [table3]. 매개 변수
  4. case [table1]. [tableID] 테이블 2에 있음, 업데이트, 그렇지 않으면 삽입

모든 시도에 감사드립니다. 지금까지 내가 이것을 알아낼 수 있다면 게시 할 것입니다.

+1

어느 RDBMS?MySQL은? SQL Server? –

+0

당신의 질문을 다르게 표현할 수 있습니까? 각 단계의 목표, 특히 3 단계를 이해하는 것이 조금 어렵습니다. 조금 더 자세하게 추가하면보다 구체적인 답변을 얻을 수 있습니다. –

+0

단일 SQL 문에서이 작업을 고려한 적이 있습니까? 설명에 따라 루프를 사용하는 저장 프로 시저가 필요하지 않을 수도 있습니다. 필요한 작업의 세부 사항에 따라 달라집니다. – Chi

답변

1

(특정 상황에 대한 증가 세부 사항 당신이 얻을 도움의 품질을 증가).

네, 그런 종류의 일이 가능합니다. 여기 사이비 코드의 비트를 얻을 당신이 시작하기입니다 :

declare @someTable (
    idx int identity(1,1), 
    column1 type, 
    column2 type, 
    etc type) 

declare @counter 

set @counter = 1 

insert into @someTable (column1, column2, etc) 
select column1, column2, etc from table1 

while @counter < (select max(idx) from @someTable) 
begin 

    -- loop through records and perform logic 
    insert result into table3 

    set @counter = @counter + 1 

end 

가능한 모든 생각하면 ... 단일 쿼리를 사용하려고합니다. 테이블을 결합하고 Case 문을 사용하여 논리를 수행하십시오.

+0

그럴 가능성이있는 반면 루핑은 나쁜 생각이며 권장해서는 안됩니다. 세트 기반 솔루션이 더 좋을 것입니다. – HLGEM

+0

그것이 내가 제안하는 것입니다 ... 당신은 단지 게시물의 끝에 그것을 만들어야합니다. –

+0

이것을 선택하겠습니다. 나는 그것을 완벽하게 매끄럽게하지는 못했다. 그러나 나는이 반복에서 시작하겠다 ... 그것은 모든 쿼리를 하나의 질의로 처리하는 방법을 찾을 때까지 빨기도 할 것이다. – Marlon

2

더 많은 정보가 필요하지만 두 가지 쿼리 (삽입 및 업데이트 중 하나)에서 모두 수행 할 수있는 확률이 98 % 이상입니다.

INSERT INTO [Table2] 
    SELECT 
     t1.[col1], /* use columns from table1 to update table2 */ 
     COALESCE(t3.[col2], t1.[col2]) /* table3 "overrides" table1 */ 
    FROM [Table1] t1 -- get all rows from table1 
    LEFT JOIN [Table3] t3 ON t3.ID = t1.Table3ID 
    LEFT JOIN [Table2] t2 ON t2.ID = t1.Table2ID 
    WHERE t2.OtherColumn IS NULL /* insert - only make changes where the record doesn't already exist */ 

및 업데이트 : 여기

는 삽입에 대한 일반적인 예입니다

UPDATE t2 
    SET t2.[col1] = t1.[col1], 
     t2.[col2] = COALESCE(t3.[col2], t1.[col2]) 
FROM [table1] t1 
LEFT JOIN [Table3] t3 ON t3.ID = t1.Table3ID 
INNER JOIN [Table2] t2 ON t2.ID = t1.Table2ID /* update - only make changes where the record does already exist */ 
1

그것은 당신의 데이터 모델에 대한 자세한 정보없이 말할 어렵지만, 유사한 경우가 있습니다 반복없이 처리 될 수 있다고 설명합니다.

예를 들어, t1과 t3의 왼쪽 조인을 선택하고, t3 값이있는 경우 t3 값을 사용하거나, t1 열 값을 기반으로 한 식을 사용할 수 있습니다. 여기에 거친 샘플이 있습니다.

insert into t2 (column list) 

Select case when t3.Column is not null then t3.Column 
when t1.Column = 'somevalue' then 'someothervalue' 
else...(other conditions/values) end 
... 
from t1 left join t3 on t1.Key = t3.Key 

내가 총을 뛰어 당신이 MS SQL 서버에 대해 얘기하고 있다고 가정거야