Tsql 查找链接表中缺少的条目

Tsql 查找链接表中缺少的条目,tsql,Tsql,我使用SQL Server 2008,并有以下表格 使用者 物体 objectid | category 9 | A 8 | B 7 | A 6 | C 用户对象 userid | objectid 1 | 9 3 | 7 3 | 6 如您所见,userobjects是一个链接表。不幸的是,它缺少一些条目。我可以在脚本中包含它们,但我想知道sql中是否有解决方案 对于属于类别“A”的每个userid和每个obj

我使用SQL Server 2008,并有以下表格

使用者

物体

objectid | category 9 | A 8 | B 7 | A 6 | C 用户对象

userid | objectid 1 | 9 3 | 7 3 | 6 如您所见,userobjects是一个链接表。不幸的是,它缺少一些条目。我可以在脚本中包含它们,但我想知道sql中是否有解决方案

对于属于类别“A”的每个userid和每个objectid,userobjects中应该有一个条目。所以我想要的是:

userid | objectid 1 | 9 1 | 7 2 | 9 2 | 7 3 | 9 3 | 7 3 | 6 我可以在脚本中包含它们,但我想知道是否有解决方案 在sql中

这是一个使用UNION的select查询


使用对象的左连接和非传统内部连接,无需联合即可完成此操作

SELECT DISTINCT u.userid, 
                o.objectid 
FROM   users u 
       LEFT JOIN userobjects uj 
              ON u.userid = uj.userid 
       INNER JOIN objects o 
               ON uj.objectid = o.objectid 
                   OR ( o.category = 'A' ) 
ORDER  BY u.userid, 
          o.objectid DESC 

< P> < /P> + 1,但您可能需要考虑使用UNIAL-ALL,因为第一组被保证不包含第二个集合。set@ConradFrix:谢谢您的评论&+1。我不明白你的意思。通常,UNION用于不同的记录,UNION ALL带来所有记录。但是应用到这个查询并没有什么区别,因为两个查询是作为一个“A”和“A”过滤器彼此排斥的。如果你在不同的问题上写了这个问题,从Actudio中选择不同的ApimiMyKieldfield,我会写下你想考虑的注释,因为ApimiMyKielfield保证是唯一的。因此,出于同样的原因,使用UNIONALL更好,删除不必要的DISTINCT更好。
select u.userId, o.objectId
from objects o cross join users u
where o.category = 'A'
union
select u.userId, o.objectId
from users u join userobjects uj on u.userid = uj.userId
     join objects o on uj.objectid = o.objectid
where o.category <> 'A'
order by u.userid,o.objectid desc

--RESULTS
userId  objectId
1       9
1       7
2       9
2       7
3       9
3       7
3       6
SELECT DISTINCT u.userid, 
                o.objectid 
FROM   users u 
       LEFT JOIN userobjects uj 
              ON u.userid = uj.userid 
       INNER JOIN objects o 
               ON uj.objectid = o.objectid 
                   OR ( o.category = 'A' ) 
ORDER  BY u.userid, 
          o.objectid DESC