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是主要位置,所有其他位置都应与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缺少子角色。(此表有数百个位置。)

shawnt00

交叉连接的常见用法是这种类型的问题,您需要显示所有可能的组合。查询的前半部分将创建该组值,然后左联接将数据值附加为跨多个维度的复合联接。

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, '!@') = coalesce(t.Role, '!@')
           and coalesce(m.Subrole, '!@#') = coalesce(t.SubRole, '!@#');

http://rextester.com/MNSU54881

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

SQL Server 2012如何检索特定记录的序数位置

来自分类Dev

SQL查找丢失的记录

来自分类Dev

获取两个表之间的丢失记录数(SQL Server 2012)

来自分类Dev

SQL Server:根据记录的值返回列名

来自分类Dev

根据sql server中的值消除记录

来自分类Dev

Concat记录SQL Server

来自分类Dev

链接的 SQL Server 记录

来自分类Dev

根据条件从视图中排除重复记录并保留1-SQL Server 2012

来自分类Dev

SQL Server-根据ID和计算机名称查找以前的记录

来自分类Dev

sql记录获取最新记录-SQL Server

来自分类Dev

XML存在方法无法过滤SQL Server 2012中的记录

来自分类Dev

使用C#将记录插入SQL Server 2012

来自分类Dev

在SQL Server 2012中更新数百万条记录

来自分类Dev

比较表的记录并在sql server中过滤它们的数据

来自分类Dev

合并SQL SERVER中的记录

来自分类Dev

筛选SQL Server中的记录

来自分类Dev

SQL Server记录计数差异

来自分类Dev

SQL Server同级记录计数

来自分类Dev

SQL Server 2012-动态SQL

来自分类Dev

SQL Server:根据TVP表的值删除表中的记录

来自分类Dev

根据SQL Server中的某些列删除重复的记录

来自分类Dev

根据最近的日期在SQL Server中插入记录

来自分类Dev

根据 SQL Server 记录获取百分比

来自分类Dev

查找记录最多的十年,SQL Server

来自分类Dev

在Sql Server 2008中查找已删除的记录

来自分类Dev

SQL Server:查找大于5的最近连续记录

来自分类Dev

SQL Server查找两个日期之间的记录

来自分类Dev

SQL Server 2008 Express:在表中查找类似的记录

来自分类Dev

SQL Server:查找两个日期之间的记录