2013-05-24 2 views
0

저는 SQL과 SQL 서버에 익숙하지 않으므로 다음 문제에 대한 도움을 주시면 감사하겠습니다.SQL 서버 2012에서 두 테이블을 사용하여 병합 쿼리

새로운 가격으로 주가 테이블을 업데이트하려고합니다.

테이블에는 공유 코드, 날짜, 가격의 세 열이 있습니다. 당신이 상상할 수 있듯이 당신이 공유 코드와 각각에 대해 10 년 데이터의 수천이있는 경우

비중 코드 + 일 = PK

하면, 테이블은 매우 큰 얻을 수 있습니다. 그래서 공유 ID 테이블이라는 별개의 테이블을 만들고 첫 번째 테이블에서 대신 공유 ID를 사용합니다. 정수로 검색하면 문자열보다 빠르기 때문에 쿼리의 속도가 빨라진다는 사실을 확실히 알고있었습니다.

Table 1 = Share_code_ID (int), Date, Price 
Table 2 = Share_code_ID (int), Share_name (string) 

이 그래서 내가 공유 ZZZ에 대한 현재의 가격으로 테이블/S를 업데이트 할 가정 해 봅시다 :

그래서, 나는 다음과 같이 두 테이블을 요약합니다. Share_code_ID 난 그냥
  • 을 발견하여 해당 날짜에 대한 새로운 가격으로 Share_code_ID 테이블 2
  • 에 'ZZZ'에 해당하기위한

    1. 봐가 발견되면, 업데이트 표 1 : 내가 필요 Share_code_ID를 찾을 수없는 경우 두 테이블을 모두 업데이트하십시오.

    이제 Share_code_ID가 새 코드에 대해 생성되는 방법을 무시해 보겠습니다. 나중에 걱정할 것입니다.

    나는 느슨하게 다음과 같은 구조를 기반으로 병합 쿼리를 사용하려고하지만, 내가 뭐하는 거지 아무 생각이없는거야 : 어떤 도움을 주시면 감사하겠습니다

    MERGE INTO [Table 1]   
    USING (VALUES (1,23-May-2013,1000)) AS SOURCE (Share_code_ID,Date,Price)      
    
    { SEEMS LIKE THERE SHOULD BE AN INNER JOIN HERE OR SOMETHING } 
    
    ON Table 2 = 'ZZZ' 
    WHEN MATCHED THEN UPDATE SET Table 1.Price = 1000  
    WHEN NOT MATCHED THEN INSERT { TO BOTH TABLES } 
    

    합니다. ID는 표 2에서 발견되지 주어 졌을 때 source table 당신은 행동을하고 싶지에 대한

  • +0

    http://catb.org/~esr/faqs/smart-questions.html 샘플 데이터가없고 오류 텍스트도없고 질문이 없습니다. 여기에 대해 말할 것도 없습니다. –

    +0

    1) 저장 프로 시저로 시도해보십시오. 입력에 Share_name, Date 및 Price 및 'ZZZ'를 전달해야합니다. 2) 공백과 작은 글자를 사용하여 표 및 열의 이름을 지정하지 마십시오. 신원 확인자를 분리하면 완전히 혼란스러워 보입니다. 실제로 표준 "표 1"또는 반 표준 [표 1]을 사용하는 것은 매우 성가시고 둔합니다. 표 2 = 'ZZZ'는 의미가 없습니다! –

    답변

    0

    http://msdn.microsoft.com/library/bb510625(v=sql.100).aspx

    당신은 target table 및 표 2에 대한 표를 사용 - 문서에서 source table

    에서 이미 읽은 것을 즉

    에 절

    WHEN NOT MATCHED BY SOURCE ... THEN <merge_matched> 
    

    후자에 해당하는 대응 0

    <merge_matched>::= 
        { UPDATE SET <set_clause> | DELETE } 
    

    Ergo, 소스 테이블에 삽입 할 수 없습니다. Table1에 무언가를 삽입 할 때 자동 삽입을위한 트리거를 사용할 수는 있지만 적절한 Shared_Name을 삽입 할 수는 없습니다. 트리거는이를 알 수 없습니다.

    그래서 두 가지 옵션이 있습니다.

    1) T-SQL 코드 블록을 만듭니다 - 저장 프로 시저를 찾습니다. 나는 또한 MS SQ에서 익명 코드 블록을 실행하는 구조가 있다고 생각한다. Firebird SQL Server의 EXECUTE BLOCK 명령과 같지만, 확실히 모른다.

    2) Table1과 Table2를 결합하여 마지막 가장 최근 날짜를 표시하는 업데이트 가능한 SQL VIEW를 작성하십시오. 그러면이보기에 행을 삽입 할 때보기의 삽입 트리거가 실제로 두 테이블에 행을 삽입합니다. 그리고 뷰의 데이터를 업데이트 할 때 업데이트시 트리거가 데이터를 수정합니다.