Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 在两列中获取同一表中相互存在和不相互存在的字段_Sql Server 2005_Tsql - Fatal编程技术网

Sql server 2005 在两列中获取同一表中相互存在和不相互存在的字段

Sql server 2005 在两列中获取同一表中相互存在和不相互存在的字段,sql-server-2005,tsql,Sql Server 2005,Tsql,这是一个类似于我发布的另一个问题,但有点不同。 我正在试图获得一个列表,其中列出了所有现有的相互用户和非相互用户的实例。 我的意思是,查询返回的结果将返回用户及其同事的列表。 这与问题类似,但不同的是,非相互用户也将返回,并且不存在列表中相互存在的用户返回的重复性。请参见下图,以简化这一切。 我又从Thanx那里得到了最初的答案Thomas 从tblDynamicUserList中选择D1.u_用户名、U1.Permission、U1.Grade、D1.f_用户名、U2.Permission、U

这是一个类似于我发布的另一个问题,但有点不同。 我正在试图获得一个列表,其中列出了所有现有的相互用户和非相互用户的实例。 我的意思是,查询返回的结果将返回用户及其同事的列表。 这与问题类似,但不同的是,非相互用户也将返回,并且不存在列表中相互存在的用户返回的重复性。请参见下图,以简化这一切。 我又从Thanx那里得到了最初的答案Thomas 从tblDynamicUserList中选择D1.u_用户名、U1.Permission、U1.Grade、D1.f_用户名、U2.Permission、U2.Grade作为D1加入tblDynamicUserList作为D2上的D2。u_用户名=D1.f_用户名和D2.f_用户名=D1.u_用户名作为U1加入tblUsers。u_用户名=D1.u_用户名作为U2上的U2加入tblUsers 经过几次试验后,我在下面注释了两行。 返回的结果是我试图完成的,如本问题开头所述,除了表中相互存在的用户返回的重复性。 我怎样才能消除这种口是心非? 从tblDynamicUserList中选择D1.u_用户名、U1.Permission、U1.Grade、D1.f_用户名、U2.Permission、U2.Grade作为D1加入tblDynamicUserList作为D2上的D2。u_用户名=D1.f_用户名/*和D2.f_用户名=D1.u_用户名/加入tblUsers作为U1上的U1。u_用户名=D1.u用户名加入tblUsers作为U2上的U2 /其中D1.U_用户名 以下是已更新查询的结果,其中注释掉了2行 所需的结果应该没有第1行和第2行,或者没有第3行和第5行,因为它们实际上是双重性的。这是因为该对存在于第3行和第5行中,每对中的名称顺序是无关的。 因为没有更好的词,这更像是逻辑上的口是心非。

提前许多天
好的,据我所知,如果结果已经包括配对a,b,那么它们不应该包括配对b,a。是这样吗?如果是,这意味着问题的根本原因是tblDynamicUserList表同时包含a、b和b、a对。如果我们先过滤查询中的结果,那么连接的结果将是您所期望的结果。注意,这也意味着你不在乎哪个用户名在u_用户名中,哪个在f_用户名中;如果这很重要,那么您需要在结果中同时使用这两种方法

下面是一个脚本,演示您当前的行为。请注意,问题中的第二个查询没有生成您发布的结果。我已将其更新为我假设您正在使用的:

declare @tblUsers table (id int, u_username varchar(20), permission varchar(10), experience int, grade int)
declare @tblDynamicUserList table (u_username varchar(20), f_username varchar(20), f_timestamp datetime default (getdate()))

insert into @tblUsers values (1, 'RanAbraGmail', 'WiFi', 1, 2000)
insert into @tblUsers values (2, 'Ana', 'Phone', 2, 3000)
insert into @tblUsers values (3, 'RoyP', 'Phone', 5, 4000)
insert into @tblUsers values (4, 'anaHeb', 'Phone', 14, 5000)
insert into @tblUsers values (7, 'Sheleg', 'Phone', 15, 5500)

insert into @tblDynamicUserList values ('ana', 'RanAbraGmail', default)
insert into @tblDynamicUserList values ('anaHeb', 'RoyP', default)
insert into @tblDynamicUserList values ('RanAbraGmail', 'Ana', default)
insert into @tblDynamicUserList values ('RanAbraGmail', 'RoyP', default)
insert into @tblDynamicUserList values ('RoyP', 'anaHeb', default)
insert into @tblDynamicUserList values ('Sheleg', 'RanAbraGmail', default)

Select D1.u_username, U1.Permission, U1.Grade, D1.f_username, U2.Permission, U2.Grade
from @tblDynamicUserList As D1
    Join @tblUsers As U1
        On U1.u_username = D1.u_username
    Join @tblUsers As U2
        On U2.u_username = D1.f_username
因此,此查询将生成您想要的结果,首先只检索用户名的不同配对,然后连接到users表以检索详细信息

Select D1.username1, U1.Permission, U1.Grade, D1.username2, U2.Permission, U2.Grade
from (select distinct case when u_username < f_username then u_username else f_username end as username1,
    case when u_username < f_username then f_username else u_username end as username2
    from @tblDynamicUserList) As D1
    Join @tblUsers As U1
        On U1.u_username = D1.username1
    Join @tblUsers As U2
        On U2.u_username = D1.username2

这可能有助于更多地显示您喜欢的输出,人们可以瞄准您想要的结果。Thanx但这不是一个正常的两面性,可以避免使用Distinct。这更像是逻辑上的两面派。请查看最新问题的底部以及当前输出和首选输出的解释。Rick非常感谢您,按照要求工作:最后一个快速问题。。。这个查询对几千对名称的效率有多高?应该很好。内部子查询只执行一次,实际上会减少SQL Server在外部查询中必须加入的行数。当然,我不能给出你的系统的实际时间,但粗略估计它只比你原来的查询慢5-10%。另外,如果它解决了你的问题,请标记为解决方案。将其标记为解决方案将使其位于该问题答案的顶部。这在这里没什么大不了的,因为这是发布的唯一答案,但这是一个很好的实践-完全同意:标记!还有thanx