Получить взаимно и не взаимно существующие поля в одной таблице в двух столбцах - PullRequest
0 голосов
/ 16 марта 2010

Этот вопрос похож на другой вопрос, который я разместил здесь , но немного отличается.

Я пытаюсь получить список всех случаев взаимных и не взаимных существующих пользователей.
Я имею в виду, что возвращенный результат запроса вернет список пользователей вместе с их коллегой.
Это похоже на вопрос здесь , но разница в том, что не взаимные пользователи также будут возвращены и без "двойственности" взаимно существующие пользователи вернутся в список (см. Изображение ниже, чтобы упростить все это ).

Я взял оригинальный ответ от Томас (Снова спасибо Томас)
Select D1.u_username, U1.Permission, U1.Grade, D1.f_username, U2.Permission, U2.Grade<br>from tblDynamicUserList As D1<br> Join tblDynamicUserList As D2<br> On D2.u_username = D1.f_username<br> And D2.f_username = D1.u_username<br> Join tblUsers As U1<br> On U1.u_username = D1.u_username<br> Join tblUsers As U2<br> On U2.u_username = D2.u_username<br>
и после нескольких испытаний я закомментировал 2 строки (ниже).
Возвращенные результаты - это то, что я пытаюсь достичь, как описано в начале этого вопроса, за исключением «двуличия», возвращаемого взаимно существующими пользователями в таблице.
Как я могу устранить эту двойственность?

Select D1.u_username, U1.Permission, U1.Grade, D1.f_username, U2.Permission, U2.Grade<br>from tblDynamicUserList As D1<br> Join tblDynamicUserList As D2<br> On D2.u_username = D1.f_username<br> /* And D2.f_username = D1.u_username <em>/<br> Join tblUsers As U1<br> On U1.u_username = D1.u_username<br> Join tblUsers As U2<br> On U2.u_username = D2.u_username<br> /</em> WHERE D1.U_userName < D1.f_username */ <br>
* Скриншот, который, надеюсь, поможет объяснить все это.
http://www.marketing2go.co.il/SqlQuestion.jpg

Вот результаты обновленного запроса (с закомментированными 2 строками)
http://www.marketing2go.co.il/QueryResults.jpg
Требуемые результаты должны быть без строк 1 и 2 (или без строк 3 и 5), поскольку в действительности они являются дублированием. Это потому, что эта пара существует в строках 3 и 5 (порядок имен в каждой паре не имеет значения).
Из-за отсутствия лучшего слова это больше похоже на логическую двуличность.

Заранее большое спасибо

1 Ответ

0 голосов
/ 16 марта 2010

Хорошо, насколько я понимаю, если результаты уже включают спаривание (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

Таким образом, этот запрос будет производить желаемые результаты, сначала получая только отдельные пары имен пользователей, и только затем присоединяясь к таблице пользователей для получения подробностей.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...