2017-10-31 11 views
1

특정 역할을 가진 사용자를 폴링하는 전자 상거래 쿼리를 작성하고 있습니다. 쿼리의 정확한 목적은 중요하지 않습니다. 중요한 것은 쿼리가 현재 의도 된대로 작동한다는 것입니다. 다음 사이의 유일한 차이점은 rd.displayname이 어디 그러나, 나는 정말 당신이 볼 수 있듯이, 나는 부모 쿼리의 절에서 거의 동일 하위 쿼리가 쿼리이 두 하위 쿼리는 어떻게 통합합니까?

. 
. 
. 
where u.firstname is not null 
and u.users_id in (
    select u.users_id from users u 
    inner join mbrrole mr on mr.member_id = u.users_id and mr.ORGENTITY_ID IN (
     select ORGENTITY_ID from po_org_tree_v 
) 
    inner join roledesc rd on rd.role_id = mr.role_id 
    where 1=1 
    and rd.displayname IN ('Customer Service Representative', 'Account Representative') 
) 
and u.users_id in (
    select u.users_id from users u 
    inner join mbrrole mr on mr.member_id = u.users_id and mr.ORGENTITY_ID IN (
     select ORGENTITY_ID from po_org_tree_v 
) 
    inner join roledesc rd on rd.role_id = mr.role_id 
    where 1=1 
    and rd.displayname = 'Registered Customer' 
); 

의이 부분을 정리하고 싶습니다 검사. SQL에서 "함수"로 쿼리를 비슷하게 만드는 몇 가지 방법이 있습니까? 프로그래밍 언어의 실제 함수와 비슷합니까? 이 하위 쿼리를 결합하여 기본 쿼리를 정리하는 방법은 무엇입니까?

+0

'이미 –

+0

을 그를 정리 할 수 ​​있도록 1 = 1 '은'1 = 1'부분은 쓸모가 WHERE 함수가 레코드를 반환 할 수 없기 때문에 당신이 기능을 사용할 수 없습니다 .. –

답변

3

코드는 두 가지 유형의 역할이 각 사용자에게 제공되는지 확인하고 있습니다.

현재 방법은 최상의 성능을해야 할 수도 있습니다,하지만 당신은 하나 개의 하위 쿼리에이를 단순화 할 수 있습니다 :

where u.firstname is not null and 
     u.users_id in (select mr.member_id 
        from mbrrole mr inner join 
          roledesc rd 
          on rd.role_id = mr.role_id 
        where mr.ORGENTITY_ID IN (select ORGENTITY_ID from po_org_tree_v) and 
          rd.displayname IN ('Registered Customer', 'Customer Service Representative', 'Account Representative') 
        group by mr.member_id 
        having sum(rd.displayname = 'Registered Customer') > 0 and 
          sum(rd.displayname IN ('Customer Service Representative', 'Account Representative')) > 0 
        ) 

참고 다음과 같이 변경 :

  • 가 하위 쿼리에서 users을 제거. 필요하지 않습니다.
  • ORGENTITY_ID 조건을 where 절로 옮겼습니다.
  • GROUP BYHAVING이 추가되었습니다. HAVING은 두 유형의 역할이 사용자에 대해 정의되어 있는지 확인합니다.
0

이 링크 (https://dev.mysql.com/doc/refman/5.7/en/create-procedure.html)를 사용하면 도움이됩니다.

당신은 너무이 같은 일을해야 결과 집합을 반환하는 절차가 아닌 함수를 사용해야합니다은 (MySQL은 차 내 잔이 아니다) :

CREATE PROCEDURE 
    procedureName(s String) 
BEGIN 
    SELECT u.users_id 
    FROM users u 
    INNER JOIN mbrrole mr ON mr.member_id = u.users_id AND mr.ORGENTITY_ID 
    IN (
    SELECT ORGENTITY_ID FROM po_org_tree_v 
    ) 
    INNER JOIN roledesc rd ON rd.role_id = mr.role_id 
    WHERE rd.displayname = s; 
END 

그리고 당신 같은이 프로 시저를 호출 이 :

WHERE u.firstname IS NOT NULL 
AND (u.users_id in procedureName('Customer Service Representative') 
    OR u.users_id in procedureName('Account Representative')) 
AND u.users_id in procedureName('Registered Customer');