내 두 번째 해결 방법 (첫 번째 의견에 대한 의견에서 말했듯이)은 상당히 복잡하지만 매우 효율적이라고 생각합니다.
나는 구체적인 내용에 관심이 있다면 내가 할 수있는 것을 볼 것입니다.
문제 : 매일 모든 방이 사용 가능하거나 차단되는 추상화를 만듭니다. 우리는 손님이 방문하고 싶어하는 시간에 가능한 객실에 관심이 있습니다. 게스트의 재배치가 가장 적은 객실을 선택하고 싶습니다.
초록 : 우리는 매일 매일 2의 거듭 제곱 (DAY VALUE)으로 표현되는 공간/일 조합의 2 차원 매트릭스를 생성합니다. 사용 가능한 공간에는 해당 DAY VALUE가 있습니다. SERO의 가치로 차단 된 방. 그래서 만약 우리가 모든 방을 합하면 방의 조합이 전체 시간을 충족시키는지를 결정할 수 있습니다.
더 구체적으로 : 우리가 ROOM의 모든 VALUES의 합을 얻은 후에는 OR 연산의 결과를 값의 합과 비교하여 주어진 방의 조합이 전체 숙박을 채우는지를 결정하기 위해 2 진 OR 함수를 사용할 수 있습니다 모든 일 동안.
DAYVALUE는 dayTable에 저장되지 않습니다. 그것은 모든 요청 (2^(startDay를-DAY))에 대해 계산됩니다
콘크리트 :
1) 당신은 모든 일을 포함하는 테이블을 작성해야합니다. 정확히 하나의 열에는 날짜가 포함됩니다 (시간이없고 시간대가 없습니다). 나는 백 년이 될 때까지 지금부터 모든 날을 포함하도록 권고 할 것이다. (따라서 한 번만 채워야합니다). (참고 : 이렇게하면 SQL 쿼리에 한 번 매일을 선택할 수 없습니다 문제 해결)
2) 당신은이 같은 출력을 생성하는 VIEW 생성 :
DAY ; DAYVALUE ; ROOM1 ; ROOM2; ROOM3 ; ROOM4 ; ... ; ROOMn
20120313 ; 1 ; 0 ; 0; 1 ; 1 ; ... ;
20120314 ; 2 ; 2 ; 0; 2 ; 2 ; ... ;
20120315 ; 4 ; 4 ; 0; 0 ; 4 ; ... ;
20120316 ; 8 ; 8 ; 0; 0 ; 0 ; ... ;
20120317 ; 16 ; 16 ; 16; 16 ; 0 ; ... ;
3)이의 SUM 생산을 . 방 값 중 하나가 모든 시간을 DAYVALUE의 합과 일치하는 (따라서 사용할 수있는 경우 4 매 2의 OR 값을 생성 성공하지 않은 경우
DAYVALUE ; ROOM1 ; ROOM2; ROOM3 ; ROOM4 ; ... ; ROOMn
31 ; 30 ; 16; 19 ; 7 ; ... ;
4)))
5 참조 결과 아무도 당신이 3 실 등이 진행해야 할 두 개의 객실에 일치하지 않으면 DAYVALUE
ROOM1 OR ROOM2 = 30 <> 31
ROOM1 OR ROOM3 = 31 == 31. This is a valid match of rooms.
6)의 합과 비교합니다.
이 절차를 사용하면 방문시 사용할 수있는 올바른 객실 세트가 항상 생성되고 올바른 방법으로 데이터베이스를 구성하거나 충분한 양의 객실을 보유한 경우 쿼리가 적절한 시간 내에 완료되어야합니다 .
즐거운 시간 되시길 바랍니다.
.net은 말할 수 없지만 SQL로 코딩 할 수 있습니다. 그게 도움이 되겠습니까? –
Angelo, 저는 일부 SQL을 보는 데 관심이 있습니다! – Tom
문제를 해결할 수 있습니까? 그렇다면 어떻게? 그리고 여기에 나온 답 중 하나가 도움이 되었습니까? –