2016-08-21 28 views
2

我有以下問題,我知道如何從同一個表中找到缺少的記錄,但我無法知道記錄從哪裏丟失:SQL Server 2012比較記錄並根據動態位置找到丟失的記錄

這裏是主表

Location  | Role | Subrole 
A            | R1    | SR1 
A            | R1    | SR2 
A            | R1    | SR3 
B            | R1    | SR1 
B            | R1    | SR2 
B            | R1    | SR3 
C            | R1    | SR1 
C            | R1    | SR2 
D            | R1    | SR1 

位置的是主地點和所有其他位置應該是比較A.我的最終目標是擁有這樣的:

MasterLocation | MasterRole | MasterSubrole | Location | Role | Subrole 
     A        | R1        | SR1          |    B     | R1   | SR1 
     A        | R1        | SR2          |    B     | R1   | SR2 
     A        | R1        | SR3          |    B     | R1   | SR3 
     A        | R1        | SR1          |    C     | R1   | SR1 
     A        | R1        | SR2          |    C     | R1   | SR2 
     A        | R1        | SR3          |    C     | R1  | MISSING OR NULL 
     A        | R1        | SR1          |    D     | R1   | SR1 
     A        | R1        | SR2          |    D     | R1   | MISSING OR NULL 
     A        | R1        | SR3          |    D     | R1   | MISSING OR NULL 

我已創建2個臨時表

CREATE TABLE #LocA 
( 
    Location Varchar(1), 
    Role Varchar(2), 
    SubRole VARCHAR(20) 
) 

CREATE TABLE #AllOthers 
( 
    Location VARCHAR(1), 
    Role VARCHAR(2), 
    SubRole VARCHAR(20) 
) 

INSERT INTO #LocA 
    SELECT 
     Location, Role, SubRole 
    FROM 
     TABLE 
    WHERE 
     Location = 'A' 

INSERT INTO #AllOthers 
    SELECT 
     Location, Role, SubRole 
    FROM 
     TABLE 
    WHERE 
     Location != 'A' 

SELECT 
    A.Location AS MasterLocation, 
    A.Role AS MasterRole, 
    A.SubRole AS MasterSubrole 
    L.Location, 
    L.Role, 
    L.Subrole 
FROM 
    #LocA AS A 
LEFT JOIN 
    #Allothers AS L ON A.Role = L.Role 
        AND A.SubRole = L.Subrole 

我越來越

MasterLocation  | MasterRole  | MasterSubrole | Location | Role|Subrole 

A                       | R1              | SR1                 |     B        | R1      | SR1 
A                       | R1              | SR2                 |     B        | R1      | SR2 
A                       | R1              | SR3                 |     B        | R1      | SR3 
A                       | R1              | SR1                 |     C        | R1      | SR1 
A                       | R1              | SR2                 |     C        | R1      | SR2 
A                       | R1              | SR3                 |     NULL   | NULL   | NULL 
A                       | R1              | SR1                 |     D        | R1      | SR1 
A                       | R1              | SR2                 |     NULL   | NULL   | NULL 
A                       | R1              | SR3                 |     NULL   | NULL   | NULL 

所以我其實不知道在哪裏子角色是從,C或D缺失(此表有數百個地點。)

+0

是在'在MasterSubrole'正確的價值目標表? – shawnt00

+0

對不起,你是對的,我糾正了Master sub的作用。這是由於複製粘貼 – Overdrive

回答

1

交叉連接的常見用法是在這種類型的問題中,您需要顯示所有可能的組合。查詢的前半部分創建了該組值,然後左連接通過跨多維的複合連接來附加數據值。

select 
    m.Location as MasterLocation, 
    m.Role as MasterRole, 
    m.Subrole as MasterSubrole, 
    l.Location, 
    coalesce(t.Role, 'Missing role') as Role, 
    coalesce(t.Subrole, 'Missing subrole') as Subrole 
from 
    T as m 
    cross join 
    (select distinct Location from T where Location <> 'A') as l 
    left outer join T as t 
     on  l.Location = t.Location 
      and m.Role = t.Role 
      and m.Subrole = t.SubRole 
where 
    m.Location = 'A'; 

您可能希望避免提字面值不止一次A更在查詢所以這裏是一個另類。

select 
    m.Location as MasterLocation, 
    m.Role as MasterRole, 
    m.Subrole as MasterSubrole, 
    l.Location, 
    coalesce(t.Role, 'Missing role') as Role, 
    coalesce(t.Subrole, 'Missing subrole') as Subrole 
from 
    (select * from T where Location = 'A') as m 
    cross apply 
    (select distinct Location from T where Location <> m.Location) as l 
    left outer join T as t 
     on  l.Location = t.Location 
      and m.Role = t.Role 
      and m.Subrole = t.SubRole; 

如果你在數據空,你想匹配起來你可能想加入這樣:

 on  l.Location = t.Location 
      and coalesce(m.Role, '[email protected]') = coalesce(t.Role, '[email protected]') 
      and coalesce(m.Subrole, '[email protected]#') = coalesce(t.SubRole, '[email protected]#'); 

http://rextester.com/MNSU54881

+0

我今天能夠在更大範圍內測試這個,這非常好,非常感謝。我曾考慮過添加地點的交叉申請,但我在執行中迷路了。謝謝! – Overdrive