2017-12-15 15 views
0

enter image description here데이터는 후에 내가 네 개의 테이블을 조인하고

사용자가 그래서 그는이 방에 합류 머물고 방 역사로, 그가 참석하는 워크숍 user_history이 즉, MS 액세스와 윈도우 폼 C#에서 네 개의 테이블 조인 중복 그는 여기에

머물고있는 회의실의 이름을 얻으려면

SELECT 
    users.ID, 
    users.user_name, 
    users.father_name, 
    users.phone, 
    users.email, 
    users.cnic, 
    users.address, 
    users.user_type, 
    users.department, 
    users.designation, 
    users.emergency_no, 
    users.img, 
    room_history.ID, 
    room_history.room_id, 
    room_history.occupant_id, 
    room_history.start_date, 
    room_history.end_date, 
    rooms.room_name, 
    user_history.ID, 
    user_history.workshop 
FROM (users 
INNER JOIN (rooms 
INNER JOIN room_history 
    ON rooms.room_id = room_history.room_id) 
    ON users.ID = room_history.occupant_id) 
INNER JOIN user_history 
    ON users.ID = user_history.user_id; 

지금 문제가 쿼리가 잘 작동입니다 MS 액세스 쿼리 디자인에 네 개의 테이블 위에 가입 후 생성되는 쿼리이지만, 사용자가 room_history에서 여러 기록과 user_history 테이블이 경우 내가 모든 필드에 "GROUP BY"를 추가 할 것을 여기 을 작동하지 않습니다, 네 개의 기록이 중복 절 "에 의해 GROUP"에 의해 고정되어 MySQL의에서 enter image description here

을 즉 반환 그것은 여전히 ​​작동하지 않습니다.

참고 :

는 아직 결과는 동일

우리가 그것을 여기

가 GROUP BY 절 내 쿼리입니다에 의해 그룹을 추가하지 못할 수 있도록

Üsers.Img 데이터 유형이 OLE 개체입니다

SELECT DISTINCT 
users.ID, 
users.user_name, 
users.father_name, 
users.phone, 
users.email, 
users.cnic, 
users.address, 
users.user_type, 
users.department, 
users.designation, 
users.emergency_no, 
room_history.ID, 
room_history.room_id, 
room_history.occupant_id, 
room_history.start_date, 
room_history.end_date, 
rooms.room_name, 
user_history.ID, 
user_history.workshop, 
user_history.user_id 
FROM (users 
INNER JOIN (rooms INNER JOIN room_history ON rooms.room_id = room_history.room_id) ON users.ID = room_history.occupant_id) 
INNER JOIN user_history ON users.ID = user_history.user_id 
GROUP BY 
users.ID, 
users.user_name, 
users.father_name, 
users.phone, 
users.email, 
users.cnic, 
users.address, 
users.user_type, 
users.department, 
users.designation, 
users.emergency_no, 
room_history.ID, 
room_history.room_id, 
room_history.occupant_id, 
room_history.start_date, 
room_history.end_date, 
rooms.room_name, 
user_history.ID, 
user_history.workshop, 
user_history.user_id; 
+0

'그룹화 기준'을 수행 할 때 그룹화 기준에 포함 할 필드에 선택 항목이 있어야합니다. 원래의 그룹화 기준도 Google에 표시하십시오. 내부, 왼쪽 및 외부/외부 조인은 거기에 수많은 예제가 있습니다. 또한 'Aliasing'을 사용하여 조인을 사용하여 더 읽기 쉽도록 만들 때'DISTINCT '는 코드 정리에 도움이 될 수 있음을 의미합니다 .. – MethodMan

+0

그룹 별 내 쿼리를 추가하면 –

+0

을 확인할 수 있습니다 이 문맥에서 select distinct/group by의 의견은 중복되는 이유를 찾는 진정한 해결책에 대한 해킹 인 경우가 많습니다.그래서 저에게있어 진짜 질문은'room_history'에 여러 개의 레코드가 있는데 가장 최근의 것인가요? 또한, 어떤 DBMS를 사용하고 있습니까? – Hambone

답변

0

내 의견은 내가 말하고 싶은 부분을 포착했지만, 짹짹이에 그것을 표현하는 것은 어렵습니다.

실제로는 GROUP BY 및/또는 SELECT DISTINCT이 작동하더라도 문제를 가리는 종류입니다. 문제는 네 개의 레코드가 있고 그 중 하나를 선택하려는 것입니다. 기록에 어떤 구별이 있다면, 이것은 효과가 없을 것입니다. 더 중요한 것은,이 작업을 수행 할 때 하나의 레코드를 원한다고 생각하면 을 지정하고 어떤 레코드를 레코드로 지정하는 것이 중요하다고 생각합니다.

예를 들어, room_history에 가장 최근의 체류 만 원하는 거주자/방에 대한 레코드가 여러 개 있다고 가정 해 봅시다. 이 경우, 귀하의 DBMS를 가정하면 with 절 및 윈도우 기능을 지원,이 당신이 얻을 것이다 :

with most_recent_history as (
    select 
    ID, room_id, occupant_id, start_date, end_date, 
    max (end_date) over (partition by room_id, occupant_id) as last_date 
    from room_history 
) 
SELECT 
    users.ID, 
    users.user_name, 
    users.father_name, 
    users.phone, 
    users.email, 
    users.cnic, 
    users.address, 
    users.user_type, 
    users.department, 
    users.designation, 
    users.emergency_no, 
    users.img, 
    h.ID, 
    h.room_id, 
    h.occupant_id, 
    h.start_date, 
    h.end_date, 
    rooms.room_name, 
    user_history.ID, 
    user_history.workshop 
FROM 
    users 
    INNER JOIN rooms 
    INNER JOIN most_recent_history h on 
    rooms.room_id = h.room_id and 
    users.ID = h.occupant_id and 
    h.end_date = h.last_date 
    INNER JOIN user_history on 
    users.ID = h.user_id; 

당신의 DBMS가 윈도 기능을 지원하지 않는 경우 및/또는 with,이 작업을 수행하는 다른 방법이 있지만, 그들은 훨씬 더 서투른 모양입니다. 이것이 Oracle, SQL Server 또는 PostgreSQL 인 경우, 이는 확실히 작동합니다.

또한 현실 세계에서는 가능하지 않지만 넥타이가있을 수있는 경우 (똑같은 날짜에 끝나는 두 개의 방에있는 사람이있는 경우), 타이 브레이커를 창에 추가 할 수 있습니다 대신 row_number을 사용하십시오.

+0

답변 해 주셔서 감사합니다. 나는 MS Access를 사용하고 있으므로, 및/또는는 작동하지 않습니다. 2 명의 사용자 만이 2 개의 날짜 사이에 방에 머무를 수 있습니다. –