2017-09-26 2 views
0

Ich versuche eine Oracle SQL-Abfrage zu erstellen, bei der ich Benutzer auswähle, die mindestens eine License = '+' enthalten, während alle Default Orgs = '-' sind. Mit anderen Worten, wählen Sie Benutzer mit Lizenzen aus, die keine Standardorganisationen haben. Im folgenden Beispiel würde ich erwarten, dass nur Annete im Ergebnis zeigt.SQL - Bedingte Auswahl

Table_Users: User, Lizenz

Table_Organizations: Default_Org, Org_Name

Abfrage unten lieferte keine Ergebnisse:

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 = '+' und Default_Org = '-') ??? (Lizenz = '+' und Default_Org = '-') – scaisEdge

Antwort

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

Während dies ein offensichtliches Code-Problem des Beitrags hervorhebt, antwortet es nicht wirklich, was er zu finden versucht, das sind Benutzer, die KEINE Standardorganisation haben. Ihre Antwort als derzeit geschrieben würde Jeff zurückgeben, obwohl er eine Standard-Organisation hat – Matt

+0

ich bitte @Matt zu unterscheiden, vielleicht sollten Sie die oben genannten mit den angegebenen Daten –

+1

Sie sind mit den oben genannten Daten richtig, es wird zurückkehren, was das OP aber gesagt hat Ich würde beim Betrachten der obigen Daten vermuten, dass OP auch einige Fälle ausließ, einschließlich Jeff License = '+' und default_org = '-' und wenn dieser Fall vorhanden ist, würde diese Abfrage Jeff zurückgeben, aber das wäre wegen einer anderen Zeile nicht erwünscht hat eine default_org – Matt

0

Zuerst würde ich vorschlagen, explizite nicht implizite Join zu verwenden, es ist ein petve von mir und ich denke, eine Reihe von anderen auf dieser Website als Explicit Join ist seit vielen Jahren Teil des ANSI SQL-Standards.

Was die Technik, die Sie eigentlich wollen, würde bedingte Aggregation genannt werden. Wenn Sie nur die Werte zählen, nach denen Sie suchen, können Sie sie in einer HAVING-Klausel verwenden, um die nicht gewünschten Datensätze auszuschließen.

Hinweis COUNT(CASE WHEN... THEN END) funktioniert, weil nur der Wert, den Sie wollen, einen Wert hat, der gezählt werden soll, und alles, was diese Bedingung nicht erfüllt, ist NULL und wird daher nicht gezählt.

Weil ich nicht weiß, welche Tabelle Lizenz auf sie könnten Sie auch potentiell vorhanden wie folgt verwenden:

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

Wissen + kommt vor - wir min Aggregat verwenden können. Dies setzt voraus, dass die Lizenz und die Standardorganisation nur "+" oder "-" Werte haben können.

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) = '-'; 

Wenn Lizenz und default_org beide Indizes mit Benutzer haben; Das wäre ziemlich schnell.