Как проверить наличие полей в одной таблице в двух столбцах - PullRequest
1 голос
/ 15 марта 2010

Я пытался использовать «Exist» и «IN». Мало того, что я не преуспел, это не казалось эффективным решением.
Вот упрощенный пример:

TblMyTable
Имя пользователя1 - Оценка - Имя пользователя2 - Оценка

Мне нужен запрос, в котором существует взаимосвязь / существование.
Я имею в виду, что возвращаемый результат запроса будет только , включая пользователей, в одной строке которых есть и имя_пользователя1, и имя_пользователя2 взаимно (лучший пример / объяснение см. На рисунке ниже) ).

Любой пользователь может работать с любым другим пользователем.
Таким образом, результат будет (порядок не имеет значения) в идеале в одну строку:
Джон - 5000 - Мария - 3000
или же
Мэри - 3000 - Джон - 5000

Суть в том, что это одна динамически изменяющаяся таблица с активными пользователями, использующими F.Key для основной таблицы пользователей, в которой есть P.Key.

Пожалуйста, смотрите изображение ниже для лучшего примера / объяснения.
База данных SQL 2005.

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

* Редактировать: Скриншот, который, надеюсь, поможет объяснить все это.
Конечным результатом должно быть 2 строки, потому что только они имеют взаимосвязь в TblDynamicUserList:

Ана - Телефон - 3000 --- RanAbraGmail - Wi-Fi - 2000
и
anaHeb - Телефон - 5000 --- RoyP - Телефон - 4000
http://www.marketing2go.co.il/SqlQuestion.jpg

Ответы [ 2 ]

2 голосов
/ 15 марта 2010

Хотелось бы что-нибудь подобное для вас:

With ManagerWorkers As
    (
    -- get managers with workers
    Select Managers.WorkerUsername As ManagerUsername, Workers.WorkerUsername
    From tblMyTable As Managers
        Join tblMyTable As Workers
            On Workers.ManagerUsername = Managers.WorkerUsername
    ) 
Select *
From ManagerWorkers
Union All
-- get workers that have a manager in the above list
Select WorkerUsername, ManagerUsername
From tblMyTable
Where Exists(   Select 1
                From ManagerWorkers
                Where ManagerWorkers.ManagerUsername = tblMyTable.ManagerUsername
                )   

РЕДАКТИРОВАТЬ : Учитывая обновление вопроса, как насчет следующего запроса:

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
1 голос
/ 15 марта 2010

Это немного связано с запросом, но работает в соответствии с запросом. Он в основном объединяет две таблицы дважды, а затем сравнивает, где есть совпадения с обеих сторон. Предложение сравнения гарантирует, что дубликаты не возвращаются символом «НЕ» в последнем предложении where.

SELECT F.UserU, F.UserV
FROM
  (SELECT U.u_userName AS UserU, V.u_username AS UserV
    FROM TblUsers U INNER JOIN TblDynamicUserList D 
    ON U.u_username = D.U_username
    INNER JOIN TblUsers V On V.u_username = D.F_UserName) F,
  (SELECT U.u_userName AS UserU, V.u_username AS UserV
    FROM TblUsers U INNER JOIN TblDynamicUserList D 
    ON U.u_username = D.U_username
    INNER JOIN TblUsers V On V.u_username = D.F_UserName) G
WHERE (F.UserU = G.UserV AND F.UserV = G.UserU AND F.UserU < F.UserV) 
AND  NOT (F.UserU = G.UserV AND F.UserV = G.UserU AND F.UserU > F.UserV) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...