使用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 |
+---------+-------------------+
參考:
發表您的查詢和樣本數據 –
數據和查詢更新的主頁。我需要的是在tbl2中完全不顯示的tbl1行。在示例數據中,所有「批准者C」組都不用於任何網站,這就是我想要分離的內容。 –