2017-09-26 89 views
0

我正在嘗試構建一個Oracle SQL查詢,其中我選擇的用戶包含至少一個License ='+',而所有Default Orgs =' - '。換句話說,選擇沒有默認組織的許可證的用戶。在下面的例子中,我希望只有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,但這不會被期望,因爲另一行有一個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 join,它是我的寵物,我認爲這個網站上的許多其他人顯式連接已經成爲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

會意+到來之前 - 我們可以使用min集合。這假設許可證和默認組織只能有'+'或' - '值。

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都與用戶有索引,這將會非常快。