2011-03-01 5 views
4

이 테이블 중 하나의 고유 한 값에 대해 세 개의 테이블을 조인 할 수있는 조인 쿼리를 찾고 있습니다.세 개의 테이블에서 개수 (*)와 "조인"을 선택하십시오.

예상되는 데이터 (Workflow, MessageMessage_Workflow_Relation)를 얻기 위해 필요한 테이블이 3 개 있습니다.

내 결과 (related_name)에 연결된 Message 테이블의 status + one 필드로 그룹화 된 워크 플로 수를 확인하고 싶습니다. 관련 이름은 adapter 필드가 wf과 같은 항목에서 가져와야하지만이 조건과 일치하는 메시지 레코드가 두 개 이상인 경우가 있습니다.이 경우 더 많은 데이터 세트가 실제로 포함 된 다음 더 많은 데이터 세트가됩니다.

나는 그것을 밖으로 분류 할 수 있어야한다고 확신하지만, 단지 작동시키지 않아야한다. 슬프게도 우리가 사용하는 제품의 주어진 스키마이므로 테이블 구조를 변경할 수 없습니다.

내 테이블 구조는 다음과 같습니다

워크 플로우 :

id | workflow_id | starttime | endtime | status 
------------------------------------------------------ 
1 |   22 |   0 |  200 |  OK 
2 |   23 |  220 |  920 | ERROR 
3 |   55 |  202 |  588 |  OK 

Message_Workflow_Relation :

id | message_id | workflow_id | 
------------------------------- 
1 |  122 |   22 | 
2 |  235 |   22 | 
3 |  456 |   22 | 
4 |  982 |   22 | 
5 |  444 |   23 | 
6 |  445 |   23 | 
7 |  585 |   55 | 
8 |  738 |   55 | 
9 |  399 |   55 | 

메시지 :

id | message_id | starttime | endtime | adapter | related_name | 
---------------------------------------------------------------- 
1 |  122 |   0 | 2335 |  wf | workflow_1 | 
2 |  235 |  222 | 1000 | other |  other | 
3 |  456 |  343 | 2330 | another |  another | 
4 |  982 |  222 | 2200 |  wf | workflow_1 | 
5 |  444 |  2223 | 3333 |  wf | workflow_2 | 
6 |  445 |  1123 | 1244 | manual |  manual | 
7 |  585 |  5555 | 5566 |  wf | workflow_1 | 
8 |  738 |  655 |  999 |  wf | worfklow_1 | 
9 |  399 |  6655 | 7732 | another |  another | 

이 다음과 같은 결과가 반환해야합니다 :

count(*) | related_name | status | 
---------------------------------- 
     2 | workflow_1 |  OK | 
     1 | workflow_2 | ERROR | 

나는이 다음 문에 붙어 있어요,하지만 나는 각 워크 플로우에 대한 adapter = wf unique의 선택을 하는 방법을 잘 모르겠습니다 :

select distinct 
    count(*), 
    m.related_name, 
    w.status 
from 
    workflow as w, 
    message as m, 
    msg_bpm_rel as rel 
where rel.workflow_id = w.workflow_id 
    and rel.message_id = m.message_id 
    and m.adapter = 'PE' 
group by m.related_name,w.status 

이것은 나를 대신합니다 (2 대신에을 반환합니다) :

count(*) | related_name | status | 
---------------------------------- 
     4 | workflow_1 |  OK | 
     1 | workflow_2 | ERROR | 

어떻게하면이 문제를 해결할 수 있습니까?

도움을 주시면 감사하겠습니다.

+0

나는 이미 당신에게 대답을했지만, 몇번이나 당신의 게시물을 읽고 또 내가 몇 가지 정보가 빠진 느낌을받습니다. workflow_1에 두 번만 존재하는 별개의 가치는 없으며 4 회 또는 1 회입니다. 그래서 나는 테이블을 놓치고있다. 셀 수있는 열은 정확히 무엇입니까? (카운트 (*)는 일반적으로 가입 할 때 특히 나쁜 생각입니다) –

답변

3

고유 값을 그룹화하고 계산하여이 작업을 수행 할 수 있습니다.

그래서 뭔가 같은 :

select count(distinct w.workflow_id), m.related_name,w.status 
from workflow as w, message as m, msg_bpm_rel as rel 
where rel.workflow_id = w.workflow_id and rel.message_id = m.message_id 
and m.adapter = 'PE' 
group by m.related_name, w.status 

이 안된하지만 쿼리가 작동 점점에서 내가 :)

0

내 첫 번째 시도를 생각 작동합니다. 나는 별개의 것을 사용하는 것을 좋아하지 않는다. 그것은 내가 여전히 뭔가 잘못 될 수 있다고 생각하게합니다 :

SELECT distinct theCount 
     ,m.related_name 
     ,w.status 
FROM workflow as w 
    ,message as m 
    ,msg_bpm_rel as rel 
    ,(SELECT count(1) as theCount 
      ,w.workflow_id as wf_id 
     FROM workflow as w 
      ,message as m 
      ,msg_bpm_rel as rel 
     WHERE rel.workflow_id = w.workflow_id 
     AND rel.message_id = m.message_id 
     AND m.adapter = 'wf' 
     GROUP BY w.workflow_id) AS t 

WHERE t.wf_id = w.workflow_id 
AND rel.workflow_id = w.workflow_id 
AND rel.message_id = m.message_id 
AND m.adapter = 'wf' 

중요한 것은이 쿼리에서 카운트가 수행되는 방법입니다. SQL 문에서 SELECT 부분에있는 두 개의 열을 단순히 그룹화했습니다. 실제로 원하는대로 계산하려면 워크 플로 ID로만 그룹화해야합니다.이 쿼리는이 작업을 수행 한 다음 그 결과를 다른 쿼리에 제공하여 원하는 것을 표시합니다.

관련 문제