2016-07-22 74 views
0

我有表有兩列這樣的:SQL:選擇未在另一列映射到值的ID

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 

我需要得到:

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

意義,我需要所有ROLE_ID沒有連接到任何RESTRICTION_ID。

如果在某些ROLE_ID的RESTRICTION_ID列中存在某個數字,那麼希望從select語句結果中排除ROLE_ID。

+0

你試過了什麼? – Abecee

+0

select * from A where RESTRICTION_ID is null and ROLE_ID not in(從RESTRICTION_ID不爲空的地方選擇ROLE_ID); ...它不返回任何東西 –

回答

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 

只是因爲大家都在顯示WHERE IN(SELECT ...回答這裏是一種通過自加盟做....

而只是爲了顯示一種方式也可以是使用EXISTS做...

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

謝謝。第一個查詢完成了這項工作。 –

2

選擇行,其中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

我看到你回答IN(SELECT id ..很多我會建議看看使用EXISTS,因爲如果有人碰巧在select語句中得到一個null,他們將不會得到他們想要的結果,存在通常被吹捧爲更快。與此說,仍然良好的投票更好的答案之一,注意我在這個問題中讀到的所有要求。 – Matt

+0

@Matt thaks right .. suggestions .. – 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 .. I'sorry i有編輯你發佈.. ..錯誤..請發佈您的原始答案。 – scaisEdge

+0

爲什麼嵌入式SELECT語句?該數據集在角色ID列中似乎不具有NULL – kbball

+0

@kbball我更新了錯誤的答案,所以我做了一個爛攤子..我很抱歉 – 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

這顯示所有的空限制... – Dave

+0

@Dave他說他需要對嗎?我誤解了這個問題嗎? – kbball

+1

他希望所有相關限制都爲null的role_id。你會得到2,2,13 ... :)雖然你對我的改正是正確的。 – 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) 

更好也許......

+0

他不希望ID分組。他想要的答案顯示重複的ID – kbball

0

下面應該讓你開始:

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

如果需要調整/進一步的細節,請發表評論。

+0

查詢不會爲我返回任何結果。 –

+0

@PhilipSt:重新測試:WITH WITH Data(role_ID,restriction_ID)AS( 選擇2,NULL來自雙聯所有 SELECT 2,15來自雙聯ALL SELECT 2,NULL來自雙聯所有 SELECT 13,12 FROM DUAL UNION ALL 選擇13,NULL FROM DUAL UNION ALL 選擇13,13 FROM DUAL UNION ALL 選擇555,NULL FROM DUAL UNION ALL 選擇555,NULL FROM DUAL UNION ALL 選擇555,NULL FROM DUAL UNION ALL 選擇91,10從雙聯所有 選擇91,12從雙聯所有 選擇91,NULL從雙 )' – Abecee

+0

'SELECT role_i d ,restriction_id 從數據中 WHERE ROLE_ID NOT IN (SELECT ROLE_ID 從數據中 GROUP BY ROLE_ID HAVING COUNT(restriction_id)> 0 );' - 並得到你預期的結果。你修改了查詢嗎? – Abecee

0

和監守在這裏您所標記的SQL是,沒有工作很好,以及公用表表達了窗口函數。

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

SELECT * 
FROM 
    cte 
WHERE 
    CountOfRestrictionsIds = 0 
0

數算全部

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

是不是和我的答案一樣,只有在我發佈我的兩個小時後? – Matt

+0

顯然它是。我剛剛忽略了你的答案,對不起。 – Serg