2012-05-07 1 views
0

두 개의 테이블이 있고 그 중 하나에 '요청'이 있고 친구 요청을 보낸 사용자가 있거나 친구 요청을 받았습니다. 두 번째 테이블에서 나는 자신에 대한 명단에 오른 사람들의 기록을 유지합니다. 이제, 나는이 모든 사용자들을 함께 (내가 요청한 사람, 나를 요청한 사람, 내가 선택한 사람) 선택하려고합니다. 나는이에 대한 통합 쿼리를 사용하여 열 유형 문제는 내가도를 오르 경우 서로 다른 사용자 ID를받지 오전다른 값을 가진 열이있을 때 별개의 결과를 얻는 방법

select Distinct userid,type,status from 
(
select RequestSenderId as UserId,'requestedme' as type,'1' as status from tblrequest where [email protected] 

union 
select RequestReceiverId as UserId,'requestedbyme' as type,'2' as status from tblrequest where [email protected] 

union 
select Shortlisteduserid as UserId,'Shortlisted' as type,'0' as status from tblshortlist where [email protected] 
) 

에 기초를 differenciate, 그는 또한 나에게 요청을 보낸하고있다.

아무도 결과에서 고유 한 사용자 ID를 얻으려고 제안 할 수 있습니까? 우선권은 shortlisted보다는 오히려 요구 한대로 userid를 얻기위한 것이다.

+2

UNION ALL을 사용해 보셨습니까? –

+0

예. 동일한 결과를 제공합니다 – nav

+0

정확히 무엇이 문제입니까? 특정 사용자 ID가 최종 결과 집합에 두 번 나타나고 한 번만 원한다는 것입니까? –

답변

0

이것은 도움이 될 수 있습니다.

select userid,type,status from 
(
select Distint RequestSenderId ,'requestedme' as type,'1' as status from tblrequest where [email protected] 

union ALL 
select Distint RequestReceiverId ,'requestedbyme' as type,'2' as status from tblrequest where [email protected] 

union ALL 
select Distint Shortlisteduserid ,'Shortlisted' as type,'0' as status from tblshortlist where [email protected] 
) 
+0

아니요 당신이 전체 결과에서 destinct를 선택하지 않고 별도의 테이블에서 선택하기 때문에 동일한 결과가 나타납니다 – nav

+0

@nav union으로 모두 시도해보십시오. 일부 시뮬레이션 된 데이터로 oracle에서 작동합니다. – Maddy

0

다음은 어떻게됩니까? 그것은

WITH requestedMe (userid, type, status) 
    AS (
     SELECT RequestSenderId AS UserId,'requestedme' AS type,'1' AS status 
     FROM tblrequest 
     WHERE [email protected]) 
    requestedByMe (userid, type, status) 
    AS (
     SELECT RequestReceiverId AS UserId,'requestedbyme' AS type,'2' AS status 
     FROM tblrequest 
     WHERE [email protected] 
      AND NOT EXISTS (
       SELECT * 
       FROM requestedMe 
       WHERE requestedMe.userid = tblrequest.RequestReceiverId)) 
    shortListed (userid, type, status) 
    AS (
     SELECT Shortlisteduserid AS UserId,'Shortlisted' AS type,'0' AS status 
     FROM tblshortlist 
     WHERE [email protected] 
      AND NOT EXISTS (
       SELECT * 
       FROM requestedMe 
       WHERE requestedMe.userid = tblshortlist.Shortlisteduserid) 
      AND NOT EXISTS (
       SELECT * 
       FROM requestedByMe 
       WHERE requestedByMe.userid = tblshortlist.Shortlisteduserid)) 
SELECT userid, type, status 
FROM requestedMe 
UNION 
SELECT userid, type, status 
FROM requestedByMe 
UNION 
SELECT userid, type, status 
FROM shortListed 
0

당신은 결과의 우선 순위를 순위 기능 (ROW_NUMBER 또는 DENSE_RANK)를 사용할 수 있습니다 .. 아마도하지만 가장 효율적인 해결책이 아니다.

SELECT UserId, Type, Status 
FROM (
    SELECT UserId, Type, Status 
    , Priority = ROW_NUMBER() OVER (PARTITION BY UserID ORDER BY Type DESC) 
    FROM (
     SELECT ReceiverId, RequestSenderId, 'requestedme', 1 FROM tblRequest 
     UNION ALL 
     SELECT SenderId, RequestReceiverId, 'requestedbyme', 2 FROM tblRequest 
     UNION ALL 
     SELECT UserId, Shortlisteduserid ,'Shortlisted', 0 FROM tblShortlist 
    ) U (FilterUserId, UserId, Type, Status) 
    WHERE FilterUserId = @UserId 
) R 
WHERE Priority = 1 
관련 문제