查找表中缺少的值

时间:2014-10-18 16:16:13

标签: sql sql-server tsql

我有3个表用于比较数据并找到其中一个表中可能缺少记录的位置。这些表是A_Client,A_USER_Defined和A_Group_Member。

A_CLIENT包含:ClientName,ClientUID

A_USER_Defined包含:ClientUID,LOB

A_GROUP_MEMBER包含:ID,ClientUID

因此每个公共列都是ClientUID。

我正在尝试查找设备,其中defined.lob =' value1'并且在member.id =' value2'

的成员表中不存在

到目前为止,我的搜索结果是空的,并且猜测它与不同的连接有关吗?这是我正在使用的查询:

SELECT A_CLIENT.ClientName
     , A_CLIENT.ClientUID
     , A_USER_DEFINED.LOB
  FROM A_CLIENT
       INNER JOIN 
       A_USER_DEFINED ON A_CLIENT.ClientUID = A_USER_DEFINED.ClientUID
 WHERE A_USER_DEFINED.LOB = 'value1' 
   AND NOT EXISTS (
                   SELECT ClientUID
                     FROM A_GROUP_MEMBER
                    WHERE GroupID = 'value2'
                  )

非常感谢任何帮助。 谢谢。

3 个答案:

答案 0 :(得分:0)

select cli.ClientName, cli.ClientUID, def.LOB
   from A_CLIENT cli
      inner join A_USER_DEFINED def on def.ClientGUID = cli.ClientGUID and def.LOB = 'value1'
      left join A_GROUP_MEMBER grp on grp.ClientUID = cli.ClientUID and mbr.ID = 'value2'
   where mbr.UID is null

select cli.ClientName, cli.ClientUID, def.LOB
   from A_CLIENT cli, A_USER_DEFINED def
   where def.ClientGUID = cli.ClientGUID and def.LOB = 'value1'
      and cli.ClientUID not in (select ClientUID from A_GROUP_MEMBER where GroupID = 'value2')

以及其他各种可能性,具体取决于您的引擎更适合使用哪种类型的连接或谓词

编辑:自我发布答案以来,问题和表/字段名称发生了很大变化。他们似乎已经安定下来,所以我改变了我的代码以适应。

注意:查询中的EXISTS谓词仅检查是否有ID =' value2&#39 ;;它应该很可能只检查具有匹配UID的记录。

此外,ClientUID和客户端 G UID之间似乎存在一些混淆。这是一个错字还是你的数据库实际上有两个名字?如果是后者,则有人迫切需要接受使用钝器的教育。

答案 1 :(得分:0)

select devices.* 
  from devices
  left join member 
    on devices.ClientUID = member.ClientUID
   and devices.lob = 'value1'   
   and member.id = 'value2' 
 where member.ClientUID is null

答案 2 :(得分:0)

我认为你实际上非常接近,只需要关联不存在的子查询。没有样本数据我还没有经过测试,但我认为最小的修正可以解决你的问题。

SELECT A_CLIENT.ClientName
     , A_CLIENT.ClientUID
     , A_USER_DEFINED.LOB
  FROM A_CLIENT 
       INNER JOIN 
       A_USER_DEFINED ON A_CLIENT.ClientUID = A_USER_DEFINED.ClientUID
 WHERE A_USER_DEFINED.LOB = 'value1' 
   AND NOT EXISTS (
                   SELECT ClientUID 
                     FROM A_GROUP_MEMBER 
                    WHERE A_GROUP_MEMBER.ClientUID = A_CLIENT.ClientUID
                      AND GroupID = 'value2'
                  )

我可能会使用一些表别名,这样更容易阅读,但是ymmv:

SELECT c.ClientName
     , c.ClientUID
     , u.LOB
  FROM A_CLIENT c
       INNER JOIN 
       A_USER_DEFINED u ON c.ClientUID = u.ClientUID
 WHERE A_USER_DEFINED.LOB = 'value1' 
   AND NOT EXISTS (
                   SELECT 1
                     FROM A_GROUP_MEMBER g
                    WHERE g.ClientUID = c.ClientUID
                      AND GroupID = 'value2'
                  )