在多个列和表中查找不存在的唯一值

3
一个错误的手动导入把我们整个AD导入了帮助台用户数据库,创建了一堆多余/重复的账户。当然,没有备份可以恢复。
为了方便清理,我想运行一个查询,找出当前未链接到任何当前或归档工单的用户。我有三个表,USER、HD_TICKET和HD_ARCHIVE_TICKET。我想比较USER表中的ID字段与其他两个表中的OWNER_ID和SUBMITTER_ID字段,并仅返回USER.ID中不存在于其他四个列中的值。
如何实现这一点?

这个问题应该发到 Server Fault 上。 - Giacomo1968
@JakeGould:你为什么这么认为? - juergen d
据我理解,这个问题不应该被点踩。 - Rahul
@juergend 正确。我以为这纯粹是一个Active Directory的问题。我改正了。 - Giacomo1968
如果用户没有提交任何工单/没有拥有任何工单,应该发生什么?你只是删除第一个查询返回的所有人吗? - Clockwork-Muse
4个回答

2

对于每个右表ID为空的关系,执行左连接:

select user.*
from user
left join hd_ticket on user.id = hd_ticket.owner_id
left join hd_ticket as hd_ticket2 on user.id = hd_ticket2.submitter_id
left join hd_archive_ticket on user.id = hd_archive_ticket.owner_id
left join hd_archive_ticket as hd_archive_ticket2 on user.id = hd_archive_ticket2.submitter_id
where hd_ticket.owner_id is null
and hd_ticket2.submitter_id is null
and hd_archive_ticket.owner_id is null
and hd_archive_ticket2.submitter_id is null

运行得非常好!谢谢! - Tekoni

1
如何尝试这样的代码:
SELECT  id
FROM    user
WHERE   id NOT IN
(
    SELECT  owner_id
    FROM    hd_ticket
    UNION ALL
    SELECT  submitter_id
    FROM    hd_ticket
    UNION ALL
    SELECT  owner_id
    FROM    hd_archive_ticket
    UNION ALL
    SELECT  submitter_id
    FROM    hd_archive_ticket
)

功能正常,但由于我试图对数千条记录进行排序,速度极慢。 - Tekoni

0
如果我理解了你的情况,我会这样做:
SELECT a.id FROM user a, hd_ticket b, hd_archive_ticket c WHERE a.id != b.id AND a.id != c.id

0
您可能想尝试以下操作。在内部查询中,我正在使用其他2个表进行内部连接,仅返回存在于所有3个表中的用户ID。然后在您的外部查询中,我只是过滤掉内部查询返回的那些ID;因为您的目标是仅获取那些不存在于其他表中的USER ID。
select ID 
FROM USER
WHERE ID NOT IN
(
select u.ID
from user u
inner join HD_TICKET h on u.ID = h.OWNER_ID
inner join HD_ARCHIVE_TICKET ha on u.ID = ha.SUBMITTER_ID
)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接