【问题标题】:SQL Server 2012 - Two Table querySQL Server 2012 - 两表查询
【发布时间】:2013-11-21 02:17:34
【问题描述】:

使用 SQL Server 2012 Express

我有两张桌子,groupsmembers1groupsmembers2

两个表都包含四列:groupnamemembernamememberaddressID

表格中填充了来自 AD (1) 和 Domino (2) 的组和成员数据。

希望比较组名和成员地址(在两个表之间),以确定组和/或组成员在哪个目录中存在/不存在的位置。

两个表如下所示:

ID      GroupName  MemberName   MemberAddress  
4033    group1     membername1  memberaddress1
4034    group1     membername2  memberaddress2
4035    group1     membername3  memberaddress3
4036    group1     membername4  memberaddress4
4037    group2     membername22 memberaddress22
4038    group2     membername23 memberaddress23
4039    group2     membername24 memberaddress24
4040    group2     membername25 memberaddress25  

我的困难是构建一个查询,该查询将向我显示来自两个表的每个组以及每个成员,即使一个表没有确切的条目。

我已经从我读过的与组合表格数据、连接表格等相关的大量帖子中尝试过这个(和变体)。

select a.GroupName, a.memberaddress, d.groupname, d.memberaddress
from [groupsmembers1] a
join [groupsmember2] d on a.groupname = d.GroupName
where a.groupname like '%somegroupname%'

上面的查询给了我这样的 49 行数据(当表 groupsmembers1 有 9 行而表 groupsmembers2 只有 7 行时 %somegroupname%:

groupname     memberaddress     groupname       memberaddress
somegroupname memberaddress1    somegroupname   memberaddress1
somegroupname memberaddress2    somegroupname   memberaddress1
somegroupname memberaddress3    somegroupname   memberaddress1
somegroupname memberaddress4    somegroupname   memberaddress1
somegroupname memberaddress5    somegroupname   memberaddress1
somegroupname memberaddress6    somegroupname   memberaddress1
somegroupname memberaddress7    somegroupname   memberaddress1
somegroupname memberaddress1    somegroupname   memberaddress2
somegroupname memberaddress2    somegroupname   memberaddress2
somegroupname memberaddress3    somegroupname   memberaddress2
somegroupname memberaddress4    somegroupname   memberaddress2
somegroupname memberaddress5    somegroupname   memberaddress2
somegroupname memberaddress6    somegroupname   memberaddress2
somegroupname memberaddress7    somegroupname   memberaddress2

我是新手,我意识到我的桌子设计可能是我的问题的一部分。任何人都可以提出一个可以帮助我的查询吗?

想要的结果:

groupname1    memberaddress1    groupname2      memberaddress2
somegroupname memberaddress1    somegroupname   memberaddress1
somegroupname memberaddress2    somegroupname   memberaddress2
somegroupname memberaddress3    somegroupname   memberaddress3
somegroupname memberaddress4    somegroupname   memberaddress4
somegroupname memberaddress5    somegroupname   memberaddress5
somegroupname memberaddress6    somegroupname   memberaddress6
somegroupname memberaddress7    somegroupname   memberaddress7
somegroupname memberaddress8    null            null
somegroupname memberaddress9    null            null  

感谢您抽出宝贵时间以及您能提供的任何帮助。

【问题讨论】:

  • FULL OUTER JOIN 会解决你的问题

标签: sql-server sql-server-2012-express


【解决方案1】:

您的表结构确实存在一些问题。查看third normal form

您确实应该为成员、地址和组设置单独的表。以及将所有这些关联在一起的适当连接表。

话虽如此,我认为这会有所帮助:

select a.GroupName, a.memberaddress, d.groupname, d.memberaddress
from [groupsmembers1] a full outer join [groupsmember2] d
    on a.GroupName = d.GroupName
        and a.MemberName = d.MemberName
where a.groupname like '%somegroupname%'

【讨论】:

  • 感谢您的回复和指向更好的表格设计的指针。我肯定会在下一次运行之前重新设计表格。使用上面的查询时,它只返回成员名称匹配的 7 行,而将不匹配的两行排除在外。有没有办法显示每个组的所有成员,即使另一个表中没有匹配项?
  • 我想通了!!非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-30
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多