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

时间:2013-01-23 15:03:30

标签: tsql

我使用SQL-Server 2008并拥有以下表格。

用户

userid
1
2
3

物体

objectid | category
9        | A
8        | B
7        | A
6        | C

userobjects

userid | objectid
1      | 9
3      | 7
3      | 6

如您所见,userobjects是一个链接表。不幸的是它遗漏了一些条目。我可以用脚本包含它们,但我想知道sql中是否有解决方案。

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

userid | objectid
1      | 9
1      | 7
2      | 9
2      | 7
3      | 9
3      | 7
3      | 6

2 个答案:

答案 0 :(得分:1)

  

我可以用脚本包含它们,但我想知道是否有解决方案   在sql。

这是使用UNION的选择查询(此处为SQL-DEMO);

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

答案 1 :(得分:0)

你可以在没有UNION的情况下使用LEFT连接和非传统的INNER JOIN来实现对象

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 

Fiddle