2017-09-26 32 views
0

すべてのDefault Orgs = ' - 'の間に少なくとも1つの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

あなたは上記のデータで正しいです。私は上記のデータを見て、営業部が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 

最初に明示的でない暗黙的な結合を使用することをお勧めします。これは私のペットです。明示的な結合というこのサイトの他の多くのものは、今何年も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

知っ+の前に来て - 私たちは分集計を使用することができます。これはライセンスを前提としており、デフォルトの組織は '+'または ' - 'の値しか持てません。

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というインデックスがある場合、これはかなり速いでしょう。