在两列中的相同表中获取相互和非相互存在的字段

时间:2010-03-15 22:56:56

标签: sql-server-2005 tsql

这个问题类似于我发布的另一个问题here,但有点不同。

我试图获得共同和非共同现有用户的所有实例的列表。
我的意思是查询返回的结果将返回用户列表及其同事。
它类似于问题here,但不同之处在于,非共同用户也将被返回并且没有“双重性”相互存在的用户在列表中返回(请参阅下面的图片按顺序简化了所有用户)。

我从Thomas(Thanx再次托马斯)那里得到了原来的答案
Select D1.u_username, U1.Permission, U1.Grade, D1.f_username, U2.Permission, U2.Grade
from tblDynamicUserList As D1
    Join tblDynamicUserList As D2
        On D2.u_username = D1.f_username
            And D2.f_username = D1.u_username
    Join tblUsers As U1
        On U1.u_username = D1.u_username
    Join tblUsers As U2
        On U2.u_username = D2.u_username

经过几次试验,我评论了2行(下图)。
返回的结果是我想要完成的,如本问题开头所述,除了表中相互存在的用户返回的“重复性”。
我怎样才能消除这种双重性?

Select D1.u_username, U1.Permission, U1.Grade, D1.f_username, U2.Permission, U2.Grade
from tblDynamicUserList As D1
    Join tblDynamicUserList As D2
        On D2.u_username = D1.f_username
            /* And D2.f_username = D1.u_username /
    Join tblUsers As U1
        On U1.u_username = D1.u_username
    Join tblUsers As U2
        On U2.u_username = D2.u_username
/
WHERE D1.U_userName < D1.f_username */

*屏幕截图,希望有助于解释这一切。
http://www.marketing2go.co.il/SqlQuestion.jpg

以下是更新后的查询结果(注释掉了2行)
http://www.marketing2go.co.il/QueryResults.jpg
所需的结果应该没有第1行和第2行(或没有第3行和第5行),因为它们实际上是双重的。这是因为该对存在于第3行和第5行中(每对中的名称顺序无关紧要)。
由于缺乏更好的词,它更像是一种逻辑上的两面性。

提前许多人

1 个答案:

答案 0 :(得分:0)

好的,据我了解,如果结果已包含配对(a,b),则不应包括(b,a)。是对的吗?如果是这样,那意味着问题的根本原因是tblDynamicUserList表包含(a,b)和(b,a)配对。如果我们首先在查询中过滤那些,那么连接的结果将是您所期望的。请注意,这也意味着您不关心u_username中的用户名和f_username中的用户名;如果这很重要,那么你在结果中就需要两者。

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

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