2017-05-11 28 views
1

設置: 表1 - 列出所有組SQL加入多個列,其中未在表2

表1列 - 羣ID,GroupDescription

表2 - 列出所有站點和許可層級關聯的羣組。

表2列 - SITEID,網站名稱,GroupT1,GroupT2,GroupT3,GroupT4,GroupT5

爲了描述,每個站點作爲5層組,其中每個組對應於在該位點的權限的特定水平。

我試圖確定tbl1.GroupID不在任何tbl2組層列中使用,以便刪除這些未使用的權限組。

我試過tbl1與tbl2的左連接,但是我找不到「on」和「where」的組合來獲得我所需要的。我通常以tbl1中的某些行爲結尾,tbl2中的某些行爲「null」,但它們仍然出現在tbl2上的其他行中。

我需要的是在tbl2中完全不出現的tbl1行。 在下面的示例數據中,所有「批准者C」組都不用於任何網站,這就是我想要分離的內容。

由於

表1實施例數據:

Group ID Group Description 
T1a   Tier 1 Approver A 
T2a   Tier 2 Approver A 
T3a   Tier 3 Approver A 
T4a   Tier 4 Approver A 
T5a   Tier 5 Approver A 
T1b   Tier 1 Approver B 
T2b   Tier 2 Approver B 
T3b   Tier 3 Approver B 
T4b   Tier 4 Approver B 
T5b   Tier 5 Approver B 
T1c   Tier 1 Approver C 
T2c   Tier 2 Approver C 
T3c   Tier 3 Approver C 
T4c   Tier 4 Approver C 
T5c   Tier 5 Approver C 

表2實施例的數據

SiteID SiteDesc ApprT1 ApprT2 ApprT3 ApprT4 ApprT5 
1  Site1  T1A  T2B  T3B  T4B  T5A 
2  Site2  T1A  T2A  T3B  T4A  T5A 
3  Site3  T1B  T2B  T3B  T4B  T5A 
4  Site4  T1B  T2A  T3B  T4A  T5A 

嘗試查詢

select distinct gr.GroupID from 
Group_Info$ gi 
join Site_Info$ si on 
si.ApprT1 is null and 
si.ApprT2 is null and 
si.ApprT3 is null and 
si.ApprT4 is null and 
si.ApprT5 is null 
+0

發表您的查詢和樣本數據 –

+0

數據和查詢更新的主頁。我需要的是在tbl2中完全不顯示的tbl1行。在示例數據中,所有「批准者C」組都不用於任何網站,這就是我想要分離的內容。 –

回答

0
BEGIN TRAN 
--Try This 
CREATE TABLE #TABLE1 (GroupId NVARCHAR(5),[Group Description] NVARCHAR(50)) 
CREATE TABLE #TABLE2 (SiteID INT,SiteDesc NVARCHAR(50), ApprT1 NVARCHAR(50), ApprT2 NVARCHAR(50),ApprT3 NVARCHAR(50),ApprT4 NVARCHAR(50), ApprT5 NVARCHAR(50)) 

INSERT INTO #TABLE1 
SELECT 'T1a','Tier 1 Approver A' UNION ALL 
SELECT'T2a', 'Tier 2 Approver A'UNION ALL 
SELECT'T3a','Tier 3 Approver A'UNION ALL 
SELECT'T4a','Tier 4 Approver A'UNION ALL 
SELECT'T5a','Tier 5 Approver A'UNION ALL 
SELECT'T1b','Tier 1 Approver B'UNION ALL 
SELECT'T2b','Tier 2 Approver B'UNION ALL 
SELECT'T3b','Tier 3 Approver B'UNION ALL 
SELECT'T4b','Tier 4 Approver B'UNION ALL 
SELECT'T5b','Tier 5 Approver B'UNION ALL 
SELECT'T1c','Tier 1 Approver C'UNION ALL 
SELECT'T2c','Tier 2 Approver C'UNION ALL 
SELECT'T3c','Tier 3 Approver C'UNION ALL 
SELECT'T4c','Tier 4 Approver C'UNION ALL 
SELECT'T5c','Tier 5 Approver C' 


INSERT INTO #TABLE2 
SELECT 1,'Site1','T1A','T2B','T3B','T4B','T5A'UNION ALL 
SELECT 2,'Site2','T1A','T2A','T3B','T4A','T5A'UNION ALL 
SELECT 3,'Site3','T1B','T2B','T3B','T4B','T5A'UNION ALL 
SELECT 4,'Site4','T1B','T2A','T3B','T4A','T5A' 



SELECT * FROM #TABLE1 
SELECT * FROM #TABLE2 
SELECT * FROM #TABLE1 WHERE GroupId NOT IN (SELECT ApprT1 FROM #TABLE2)AND GroupId NOT IN (SELECT ApprT2 FROM #TABLE2) 
AND GroupId NOT IN (SELECT ApprT3 FROM #TABLE2)AND GroupId NOT IN (SELECT ApprT4 FROM #TABLE2)AND GroupId NOT IN (SELECT ApprT5 FROM #TABLE2) 

ROLLBACK TRAN 
0

使用cross apply(values ...)以反轉Site_Info$not exists()中的五個ApprT[1-5]列,以找出哪個GroupId不存在於該列表中。

select * 
from Group_Info$ gi 
where not exists (
    select 1 
    from Site_Info$ si 
    cross apply (values (ApprT1),(ApprT2),(ApprT3),(ApprT4),(ApprT5) 
    ) u (GroupId) 
    where gi.GroupId = u.GroupId 
); 

rextester演示:http://rextester.com/OFI50245

回報:

+---------+-------------------+ 
| GroupId | GroupDescription | 
+---------+-------------------+ 
| T3a  | Tier 3 Approver A | 
| T5b  | Tier 5 Approver B | 
| T1c  | Tier 1 Approver C | 
| T2c  | Tier 2 Approver C | 
| T3c  | Tier 3 Approver C | 
| T4c  | Tier 4 Approver C | 
| T5c  | Tier 5 Approver C | 
+---------+-------------------+ 

它可能更容易使用common table expression讀,或者它可能不是:

;with cte as (
    select u.GroupId 
    from Site_Info$ si 
    cross apply (values (ApprT1),(ApprT2),(ApprT3),(ApprT4),(ApprT5) 
    ) u (GroupId) 
) 
select * 
from Group_Info$ gi 
where not exists (
    select 1 
    from cte 
    where gi.GroupId = cte.GroupId 
) 
以「審批C」隔離

一種方式是通過在GroupDescription最後一個字母,我們可以一起使用聚合與unpivoting數據找到誰不會出現在Site_Info$那些審批前面的方法:

select 
    Approver = right(GroupDescription,1) 
    , ApproverGroupCount = count(gi.GroupId) 
    , ApproverSiteCount = count(si.GroupId) 
from Group_Info$ gi 
    left join (
    select distinct u.GroupId 
    from Site_Info$ si 
     cross apply (values (ApprT1),(ApprT2),(ApprT3),(ApprT4),(ApprT5) 
     ) u (GroupId) 
    ) si 
    on gi.GroupId = si.GroupId 
group by right(GroupDescription,1) 
having count(si.GroupId) = 0; 

rextester演示:http://rextester.com/USVYSO98254

回報:

+----------+--------------------+-------------------+ 
| Approver | ApproverGroupCount | ApproverSiteCount | 
+----------+--------------------+-------------------+ 
| C  |     5 |     0 | 
+----------+--------------------+-------------------+ 

我們可以在一個共同的表EXP包該查詢ression並用它來加入到Group_Info$返回所有審批C中的列:

with cte as (
    select 
     Approver = right(GroupDescription,1) 
    from Group_Info$ gi 
    left join (
     select distinct u.GroupId 
     from Site_Info$ si 
     cross apply (values (ApprT1),(ApprT2),(ApprT3),(ApprT4),(ApprT5) 
     ) u (GroupId) 
     ) si 
     on gi.GroupId = si.GroupId 
    group by right(GroupDescription,1) 
    having count(si.GroupId) = 0 
) 
select gi.* 
from group_info$ gi 
    inner join cte 
    on right(gi.GroupDescription,1) = cte.Approver 

rextester演示:http://rextester.com/USVYSO98254

回報:

+---------+-------------------+ 
| GroupId | GroupDescription | 
+---------+-------------------+ 
| T1c  | Tier 1 Approver C | 
| T2c  | Tier 2 Approver C | 
| T3c  | Tier 3 Approver C | 
| T4c  | Tier 4 Approver C | 
| T5c  | Tier 5 Approver C | 
+---------+-------------------+ 

參考: