2016-07-22 12 views
0

I Tabelle wie folgt mit zwei Spalten:SQL: Wählen Sie IDs, die auf Werte in einer anderen Spalte nicht zugeordnet werden

ROLE_ID  RESTRICTION_ID 
--------- --------------- 
2   null 
2   15 
2   null 
13   12 
13   null 
13   13 
555   null 
555   null 
555   null 
91   10 
91   12 
91   null 

Ich brauche zu bekommen:

ROLE_ID  RESTRICTION_ID 
    --------- --------------- 
    555   null 
    555   null 
    555   null 

Bedeutung, dass ich alle brauchen ROLE_IDs, die nicht mit einer RESTRICTION_ID verbunden sind.

Wenn in der Spalte RESTRICTION_ID eine Nummer für einige ROLE_ID vorhanden ist, wird die ROLE_ID aus den Ergebnissen der SELECT-Anweisung ausgeschlossen.

+0

Was haben Sie versucht? – Abecee

+0

Wählen Sie * aus A, wobei RESTRICTION_ID null ist und ROLE_ID nicht in (wählen Sie ROLE_ID aus A, wo RESTRICTION_ID nicht null ist); ... es gibt nichts zurück –

Antwort

2
SELECT t1.* 
FROM 
    table t1 
    LEFT JOIN table t2 
    ON t1.ROLE_ID = t2.ROLE_ID 
    AND t2.RESTRICTION_ID IS NOT NULL 
WHERE 
    t2.ROLE_ID IS NULL 

Nur weil alle anderen das zeigt WHERE IN (SELECT ... Antwort hier ist ein Weg, um es über ein Selbst zu tun kommen ....

Und nur ein Weg, um zu zeigen, es sein kann, geschieht mit VORHANDEN ...

SELECT t1.* 
FROM 
    table t1 
WHERE 
    NOT EXISTS (SELECT * 
      FROM 
       table t2 
      WHERE 
       t1.ROLE_ID = t2.ROLE_ID 
       AND t2.RESTRICTION_ID IS NOT NULL) 
+0

Danke. Die erste Abfrage hat den Job erledigt. –

2

die Zeilen auswählen, wo resctriction_id

select * from my_table 
where resctiction_id is null 
and role_id not in (select role_id from my_table where resctiction_id is not null) ; 
+0

Ich sehe, Sie antworten IN (SELECT ID .. viel ich würde empfehlen, mit EXISTS zu suchen, denn wenn jemand zufällig eine Null in der Select-Anweisung bekommen, werden sie nicht die gewünschten Ergebnisse erhalten und Exists wird in der Regel als schneller angepriesen.mit der besagten noch guten Abstimmung eine der besseren Antworten, die auf alle Anforderungen achten, die ich in der Frage gelesen habe .. – Matt

+0

@Matt thaks right .. Vorschläge .. – scaisEdge

0
SELECT ROLE_ID, RESTRICTION_ID 
FROM Table 
WHERE 
ROLE_ID NOT IN (SELECT ROLE_ID FROM Table WHERE RESTRICTION_ID IS NOT NULL) 
+0

@RoberColumn .. Ich bin mir sicher Haben Sie edit Sie Post .. ..wrongly ..please Post Sie ursprüngliche Antwort .. – scaisEdge

+0

Warum die eingebettete SELECT-Anweisung? Der Datensatz scheint nicht zu haben NULL in der Rolle ID-Spalte – kbball

+0

@ kbball Ich habe Update die falsche Antwort, so dass ich getan ein Durcheinander ... es tut mir leid – scaisEdge

0
SELECT ROLE_ID, RESTRICTION_ID 
FROM <Your Table> 
WHERE RESTRICTION_ID IS NULL 
AND ROLE_ID NOT IN 
(SELECT ROLE_ID FROM <Your Table> WHERE RESTRICTION_ID IS NOT NULL) sub 
+0

Das zeigt alle Null-Einschränkungen ... – Dave

+0

@Dave Das ist, was er sagte, er braucht richtig? Lies ich die Frage falsch? – kbball

+1

Er möchte die role_id, in der alle zugehörigen Einschränkungen null sind. Du bekommst 2,2,13 ... :) Du hattest recht mit der Korrektur für meine. – Dave

0
Select role_id, restriction_id 
From Table 
Where role_id in (Select ROLE_ID 

From Table 
Group by ROLE_ID 
Having COUNT(RESTRICTION_ID)=0) 

Besser vielleicht null ist ...

+0

er will nicht die IDs gruppiert.Seine gewünschte Antwort zeigt die IDs wiederholt – kbball

0

Folgendes sollten Sie beginnen:

SELECT 
    role_id 
    , restriction_id 
FROM Data 
WHERE role_id NOT IN 
(SELECT 
    role_id 
    FROM Data 
    GROUP BY role_id 
    HAVING COUNT(restriction_id) > 0 
); 

Bitte kommentieren Sie, wenn und wie dies Anpassung/weitere Details erfordert.

+0

Die Abfrage gibt keine Ergebnisse für mich zurück. –

+0

@PhilipSt: Re-geprüft: 'mit Daten (ROLE_ID, restriction_ID) AS ( 2 SELECT, NULL FROM DUAL UNION ALL SELECT 2, 15 FROM DUAL UNION ALL 2 SELECT, NULL FROM DUAL UNION ALL SELECT 13, 12 FROM DUAL UNION ALL 13 SELECT, NULL FROM DUAL UNION ALL SELECT 13, 13 FROM DUAL UNION ALL 555 SELECT, NULL FROM DUAL UNION ALL 555 SELECT, NULL FROM DUAL UNION ALL 555 SELECT, NULL FROM DUAL UNION ALL SELECT 91, 10 FROM DUAL UNION ALLE SELECT 91, 12 FROM DUAL UNION ALLES SELECT 91, NULL VOM DUAL) ' – Abecee

+0

' SELECT role_i d , restriction_id aus Daten WHERE ROLE_ID NICHT IN (SELECT ROLE_ID aus Daten GROUP BY ROLE_ID MIT COUNT (restriction_id)> 0 ); '- und bekam Ihr erwartetes Ergebnis. Haben Sie die Abfrage geändert? – Abecee

0

und weil Sie SQL hier markiert haben, ist eine Fensterfunktion mit Ausdruck gemeinsamen Tabelle, die den Job auch gut tut.

WITH cte AS (
    SELECT 
     * 
     ,COUNT(RESTRICTION_ID) OVER (PARTITION BY ROLE_ID) as CountOfRestrictionsIds 
    FROM 
     TableName 
) 

SELECT * 
FROM 
    cte 
WHERE 
    CountOfRestrictionsIds = 0 
0

Alle zählen

with t as (
    -- sample data 
    select 2 as ROLE_ID ,null as RESTRICTION_ID from dual union all 
    select 2 ,15 from dual union all 
    select 2 ,null from dual union all 
    select 13 ,12 from dual union all 
    select 13 ,null from dual union all 
    select 13 ,13 from dual union all 
    select 555 ,null from dual union all 
    select 555 ,null from dual union all 
    select 555 ,null from dual union all 
    select 91 ,10 from dual union all 
    select 91 ,12 from dual union all 
    select 91 ,null from dual 
) 
select ROLE_ID,RESTRICTION_ID 
from (
    select t.* 
     ,count(RESTRICTION_ID) over(partition by ROLE_ID) as cnt 
    from t 
    ) x 
where cnt=0; 
+0

ist das nicht das gleiche wie eins meine Antwort nur 2 Stunden nachdem ich meine gepostet habe? – Matt

+0

Offenbar ist es. Ich habe deine Antwort nur übersehen, Entschuldigung. – Serg

Verwandte Themen