2011-06-10 3 views
1

내가 두 테이블 기본 SQL 삽입 문 접근

  • 고객

    (아이디 INT, 사용자 이름 VARCHAR)
  • 주문 (CUSTOMER_ID INT, ORDER_DATE 날짜)

지금 내가 삽입 할을 감안할 때 고객 테이블에있는 고객 정보를 기반으로 주문 테이블로 변환합니다.

이 문제를 승인 할 수있는 몇 가지 방법이 있습니다.

먼저 고객 정보를 변수로 쿼리 한 다음 INSERT 문에서 사용할 수 있습니다.

DECLARE @Customer_ID int 
SELECT @Customer_ID = id FROM Customer where username = 'john.smith' 
INSERT INTO Orders (customer_id, order_date) VALUES (@Customer_ID, GETDATE()) 

두 번째 접근법은 INSERT 및 SELECT 쿼리 조합을 사용하는 것입니다.

INSERT INTO Orders (customer_id, order_date) 
SELECT id, GETDATE() FROM Customers 
WHERE username = 'john.smith' 

제 질문은 속도와 오버 헤드의 관점에서 진행하는 더 좋은 방법이며 그 이유는 무엇입니까? 고객 테이블에서 많은 정보를 얻었 으면 두 번째 방법이 훨씬 좋습니다.

p.s. 기술 인터뷰 중 하나에서이 질문을 받았습니다.

+0

인터뷰 질문에 어떻게 대답 했습니까? –

+0

나는 그들에게 당신이했던 것과 비슷한 대답을주었습니다.그냥 모든 사람들의 의견을 듣고 싶었어. 답장을 보내 주셔서 감사합니다. –

답변

4

두 번째 방법이 더 좋습니다.

고객을 찾을 수없는 경우 첫 번째 방법은 실패합니다. 고객 ID가 반환되었는지 확인하지 않습니다.

두 번째 방법은 고객을 찾을 수없는 경우 아무 것도 수행하지 않습니다.

오버 헤드 접근에서 필요없는 변수를 만드는 이유는 무엇입니까? 일반적으로 set 기반 SQL이 더 나은 접근 방법입니다.

1

두 방법 중 하나를 사용하지 않는 것이 좋습니다. 왜 처음에는 이드가 아닌 고객 이름을 가지고 있습니까? 해당 주를 ID로 유지하여 현재 고객에 대한 참조를 유지 관리하는 사용자 인터페이스가 없습니까? 조회로 이름을 지정하면 잠재적으로 잘못된 고객을 선택할 수 있습니다.

내게 알려지지 않은 이유 때문에이 작업을 수행해야하는 경우 두 번째 방법은 단 하나의 명령문 만 포함하므로 더 효율적입니다.

1

일반적인 실제 주문 처리 시스템에서 사용자는 이미 검색 인터페이스를 통해 고객을 찾거나 사전 순으로 표시된 고객 목록에서 고객을 선택했습니다. 고객 프로그램은 해당 고객의 주문을 삽입 할 때 이미 CustomerID를 알고 있습니다.

또한 주문 날짜는 일반적으로 ORDERS 테이블 정의의 일부로 getdate()가 기본값이며, 쿼리는 대개 해당 열을 무시할 수 있습니다.

그러나 주문의 여러 광고 항목을 처리하려면 ORDER_HEADER에 삽입하면 ORDER DETAIL 광고 항목 하위 행에 삽입 될 수 있도록 주문 헤더 ID를 반환해야합니다.

0

고객 테이블을 참조하는 외래 키를 주문 테이블에 순서대로 만듭니다.