2015-01-31 3 views
0

나는 Orders 테이블과 Order_Details 테이블을 가지고 있습니다.JOINS 또는 복수 쿼리

하나의 주문과 모든 관련 세부 정보를 선택해야합니다.

이 작업은 두 개의 Select 문 (주문과 세부 정보)을 사용하므로 두 개의 SqlDataReaders을 반복 한 다음 내 UI를 채우기 위해 루프를 반복합니다.

예 :
; // 1 개의 레코드를 반환합니다. 결과를 UI에 표시합니다.
2. SELECT * FROM Order_Details Where orderid = 3; // 같은 UI에서 목록 형식으로 결과와 쇼를 통해 X의 기록을 루프를 반환합니다

  • 또는 -

내가 한 선택 문을 사용해야 하나 SqlDataReader하지만 코스 I의 각 행에 많은 추가 데이터가 반환됩니다.


;

두 번째 경우에는 데이터베이스를 한 번만 밟았지만 각 행에는 두 테이블의 데이터가 모두 포함됩니다. 나는 첫 번째 경우가 갈 길이라고 생각합니다. 누구든지 더 좋은 방법이 있습니까?

답변

1

첫 번째 경우에는 두 가지 문제가 있습니다.
1. 데이터베이스에 대한 왕복 이동이 두 번 발생하므로 바람직하지는 않습니다. 이는 Network traffic으로 증가합니다.
2. 두 결과 모두 datatable으로 채우고 있다고 가정하십시오. 두 번째 쿼리가 실패하면 datatable에 논리를 적용하여 어떤 레코드가 어떤 테이블에서 가져온 레코드인지 식별해야합니다. 이를 위해서는 Transaction에서 모든 것을 결합해야합니다.

SELECT * FROM Orders Where orderid = 3; 
SELECT * FROM Order_Details Where orderid = 3; 

더 나은 방법은 왕복 1 회만 있기 때문에 두 번째 방법을 사용하는 것이 좋습니다. LEFT JOIN을 사용할 때 많은 문제는 없습니다. 테이블에 적절한 Indexes이 있는지 확인하십시오.

SELECT * FROM Orders 
LEFT JOIN Order_Details ON Order_Details.orderid = Orders.orderid 
WHERE Orders.orderid = 3; 

편집 :

두 기차에서 어떤 상자를 선택해야 사람을 생각해 보자. 그는 3이라는 번호의 상자를 Train1에서 골라야하고 Train2에서 3a, 3b 등의 일부 상자를 오름차순/내림차순으로 정렬해야합니다.

그는 교통량이 많은 도시를 건너서 기차역에 도착해야합니다. 그가 3이라는 번호의 박스를 골라서 Train1에서 집으로 간 다음 상자를 버리고 Train2, 3a, 3b 등의 상자를 골라 집으로 돌아가서 3a, 3b 상자?

트래픽이 많아서 너무 많은 시간을 할애해야합니다. 그의 집이 기차역에 가깝고 피크 시간이 아닌 여행을한다면 큰 문제는 아닐 것이다.

So coming to your tables - Why we need such round trips? 
It would be good if you do it in one query. 

이제 50 개 이상의 상자가 기차역에서 선택한다고 간주합니다. 이 경우 상자를 차량에 장전하는 데 시간이 더 걸립니다.

So coming to your tables - The more number of columns 
you select in the select query, the more time it will take. 
For that also single query is advisable. 
+0

감사합니다. 각 Order_Detail 행에 모든 Order 데이터가 포함된다는 사실은 어떻습니까? 각 Order_Detail 행에 대해 50 개의 추가 데이터 열인 Order 데이터의 50 개의 열을 가져와야하는 경우 그것은 하나의 추가 데이터베이스 쿼리보다 바람직합니다. – user1680985