2017-09-26 2 views
0

모든 기본 조직이 '-'인 동안 하나 이상의 License = '+'가 포함 된 사용자를 선택하는 Oracle SQL 쿼리를 작성하려고합니다. 즉, 기본 조직이없는 라이선스가있는 사용자를 선택합니다. 아래 예에서 나는 Annete 만 결과에 나타낼 것으로 기대합니다.SQL - 조건부 선택

Table_Users : 사용자, 라이센스

Table_Organizations : 반환 아래 Default_Org, ORG_NAME

쿼리 결과가 없습니다 :

select User 
from Table_Users, Table_Organizations 
where Table_Users.User = Table_Organizations.UsrX 
and (Default_Org = '+' and Default_Org = '-')* 

Table Example

+0

(Default_Org = '+'및 Default_Org = '-') ??? (license = '+'및 Default_Org = '-') – scaisEdge

답변

0
select User 
from Table_Users, Table_Organizations 
where Table_Users.User = Table_Organizations.UsrX 
and License = '+' and Default_Org = '-' 
+0

이 게시물의 명백한 코드 문제를 지적했지만 실제로 찾으려는 것은 기본 조직이없는 사용자에게 대답하지 않습니다. 현재 작성된 대답은 jeff가 기본 조직을 가지고 있더라도 – Matt

+0

@Matt가 달라지기를 바란다. 제공된 데이터로 위와 같이 실행해야한다. –

+1

위의 데이터에 맞으면 OP가 말한 것을 반환하지만 위의 데이터를 살펴보면 OP에서도 Jeff License = '+'및 default_org = '-'가 포함 된 몇 가지 사례를 제외하고이 케이스가있는 경우이 쿼리는 Jeff를 반환 하겠지만 다른 행 have default_org – Matt

0
SELECT 
    u.User 
FROM 
    Table_Users u 
    INNER JOIN Table_Organizations o 
    ON u.User = o.Usrx 
GROUP BY 
    u.User 
HAVING 
    COUNT(CASE WHEN License = '+' THEN 1 END) > 0 
    AND COUNT(CASE WHEN Default_Org = '+' THEN 1 END) = 0 

우선 Explicit not Implicit 조인을 사용하는 것이 좋습니다. 내 생각에이 애플릿은 Explicit 조인으로 많은 사람들이 ANSI SQL 표준의 일부로 여겨 졌다고 생각합니다.

실제로 원하는 기술을 조건부 집계라고합니다. 찾고자하는 값만 세면 HAVING 절에서이 값을 사용하여 원하지 않는 레코드를 제외 할 수 있습니다.

참고 COUNT(CASE WHEN... THEN END)은 원하는 값만 계산할 값을 가지며 해당 조건을 충족하지 않는 것은 NULL이므로 계산되지 않으므로 작동합니다. 다음과 같이

나는 그것에 라이센스를 갖고있는 테이블 모르기 때문에 당신은 또한 잠재적으로 사용할 수있는 존재 :

SELECT 
    u.User 
FROM 
    Table_Users u 
WHERE 
    u.License = '+' 
    AND NOT EXISTS(SELECT 1 FROM Table_Organizations o WHERE u.User = o.Usrx AND Default_Org = '+') 
0

아는 + 전에 온다 - 우리가 분 집계를 사용할 수 있습니다. 이것은 라이선스를 가정하고 기본 org는 '+'또는 '-'값만 가질 수 있습니다.

With cte ("user", license, default_org, org_name) as (
SELECT 'Jeff','+','+', 'Org 1' FROM DUAL UNION ALL 
SELECT 'Jeff','-','-', 'Org 2' FROM DUAL UNION ALL 
SELECT 'Jeff','-','-', 'Org 3' FROM DUAL UNION ALL 
SELECT 'Annete','+','-', 'Org 4' FROM DUAL UNION ALL 
SELECT 'Annete','-','-', 'Org 5' FROM DUAL) 

SELECT "user", min(license), Min(default_org) 
FROM CTE A 
GROUP BY "user" 
HAVING min(license) = '+' 
    AND min(Default_org) = '-'; 

license 및 default_org에 모두 user와 인덱스가있는 경우; 이것은 꽤 빠를 것입니다.