【问题标题】:Find missing entries in link table在链接表中查找缺失的条目
【发布时间】:2013-01-23 23:42:01
【问题描述】:

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

用户

用户名
1
2
3

对象

objectid |类别
9 |一个
8 |乙
7 |一个
6 | C

用户对象

用户名 |对象标识
1 | 9
3 | 7
3 | 6

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

对于属于类别“A”的每个用户 ID 和每个对象 ID,用户对象中都应该有一个条目。所以我想要的是这样的:

用户名 |对象标识
1 | 9
1 | 7
2 | 9
2 | 7
3 | 9
3 | 7
3 | 6

【问题讨论】:

    标签: tsql


    【解决方案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 但您可能需要考虑使用 UNION ALL,因为保证第一组不包括第二组
    • @ConradFrix:感谢您的评论和 +1。我不明白你的意思。一般来说,UNION 用于不同的记录,UNION ALL 带来所有记录。但是应用到这个查询并没有什么不同,因为两个查询是互斥的(使用='A'&lt;&gt;'A' 过滤器)。
    • 如果你在另一个问题上写了这个 SELECT DISTINCT APrimaryKeyField FROM ATable 我会写评论 你可能想考虑放弃 DISTINCT 因为 APrimaryKeyField 保证是唯一的 所以使用 UNION ALL 更好,原因相同,删除不必要的 DISTINCT 更好。
    【解决方案2】:

    您可以在没有 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

    【讨论】:

      猜你喜欢
      • 2016-04-08
      • 2021-07-09
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多