Объединение данных, которые нельзя объединить - PullRequest
2 голосов
/ 03 марта 2011

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

У меня странная ситуация, когда существует структура входа, которую установила моя компания.Таблицы выглядят так:

User

  int        int          bit
UserId | CompanyId | IsPrimaryUser |

UserLoginBridge

  int      int
UserId | LoginId

Login

 int
LoginId | CompanyId | ...

Очевидно, что отношения здесь намного меньше оптимальных.Но это то, с чем я должен работать.Моя проблема заключается в том, что пользователи могут быть назначены во многие компании ... поэтому существует отношение 1: M между пользователем и логином, которое выражается UserLoginBridge.

Существует также основной пользователь ..., указанный настоящим1 в столбце IsPrimaryUser.Кроме того, основной пользователь никогда не помещается в UserLoginBridge, но у него есть запись для входа в систему .... Итак, подвох ... Я не могу присоединиться к основному пользователю.

Есть мысли?

Ideal DataSet

UserId | IsPrimaryUser | CompanyId | LoginId

1 Ответ

2 голосов
/ 04 марта 2011

Я попытаюсь объяснить метод моего безумия.

Подзапрос "q" в первом SELECT находит минимальный идентификатор входа для каждой компании. Это должны быть логины для основного пользователя, по одному на компанию. Затем я могу присоединить основных пользователей к этому подзапросу по CompanyId.

Второй выбор для обычных пользователей не нуждается в объяснении.

Это можно написать без использования UNION с использованием COALESCE для CompanyId и LoginId, но я думаю, что эту версию немного легче читать и понимать.

/* Primary User */
SELECT u.UserId, u.IsPrimaryUser, q.CompanyId, q.LoginId
    FROM User u
        INNER JOIN (SELECT l.CompanyId, MIN(l.LoginId)
                        FROM login l
                        GROUP BY l.CompanyId) q
            ON u.CompanyId = q.CompanyId
    WHERE u.IsPrimaryUser = 1
UNION ALL
/* Regular Users */
SELECT u.UserId, u.IsPrimaryUser, l.CompanyId, l.LoginId
    FROM User u
        INNER JOIN UserLoginBridge ulb
            ON u.UserId = ulb.UserId
        INNER JOIN Login l
            ON ulb.LoginId = l.LoginId
    WHERE u.IsPrimaryUser = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...