首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在两列的同一表中得到相互存在和不存在的字段

在两列的同一表中得到相互存在和不存在的字段
EN

Stack Overflow用户
提问于 2010-03-15 22:56:55
回答 1查看 122关注 0票数 0

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

我试图得到一个所有实例的相互和非相互存在的用户列表。

我的意思是,从查询返回的结果将返回一个用户列表和他们的同事。

它类似于问题here,但不同之处在于,非相互用户也将被返回,而不存在于列表中的“相互欺骗”用户返回(参见下面的图像顺序简化)。

我从Thomas那里得到了最初的答案(再次感谢托马斯)

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

经过几次试验,我去掉了两行(见下文)。

返回的结果是我试图完成的,正如在这个问题的开头所描述的,除了表中相互存在的用户返回的“欺骗”之外。

我怎样才能消除这种两极化?

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

 /T1393-1989工业用粉末冶金/* 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行(每对名称的顺序无关)。

因为缺少一个更好的词,它更像是逻辑上的两面派。

许多先期

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-03-16 04:13:06

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

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

代码语言:javascript
复制
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表来检索详细信息。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2451053

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档