Sql 查找表中缺少的值
我用3个表来比较数据,并找出其中一个表中可能缺少的记录。这些表是一个客户机、一个定义的用户和一个组成员 客户端包含:ClientName、ClientUID 定义的用户包含:ClientUID,LOB 组成员包含:ID,ClientUID 因此,每个中的公共列都是ClientUID 我正在尝试查找defined.lob='value1'的设备,但在member.id='value2'的成员表中不存在这些设备 到目前为止,我的搜索结果是空的,我猜这和不同的连接有关?以下是我正在使用的查询:Sql 查找表中缺少的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我用3个表来比较数据,并找出其中一个表中可能缺少的记录。这些表是一个客户机、一个定义的用户和一个组成员 客户端包含:ClientName、ClientUID 定义的用户包含:ClientUID,LOB 组成员包含:ID,ClientUID 因此,每个中的公共列都是ClientUID 我正在尝试查找defined.lob='value1'的设备,但在member.id='value2'的成员表中不存在这些设备 到目前为止,我的搜索结果是空的,我猜这和不同的连接有关?以下是我正在使用的查询: SEL
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'
)
任何帮助都将不胜感激。
多谢各位
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'的记录;它很可能只检查具有匹配UID的记录
此外,ClientUID和ClientGUID之间似乎存在一些潜在的混淆。这是一个打字错误还是你的数据库中实际上有两个名字?如果是后者,那么有人非常需要用钝器进行教育。我认为您实际上非常接近,只需要关联不存在的子查询。如果没有样本数据,我还没有测试,但我认为最小的修正将修复您的查询
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
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'
)
您能否显示一个您认为可能接近正常工作的查询?另外,您正在使用哪些RDBMS?