Нужна помощь с запросом SQL - PullRequest
1 голос
/ 09 марта 2011

Текущий запрос

SELECT *
FROM employee AS E
INNER JOIN credential AS C ON (C.id = E.credentialId)
LEFT JOIN person AS P ON (C.personId = P.id)

Я хочу изменить этот запрос так, чтобы я просто ВЫБИРАЛ сотрудников / учетные данные, которые имеют оба логинроля 1 и 2 (loginrole.id).

Соответствующие таблицы

loginrole
    id
    name
credential_has_loginrole
    id
    credentialId
    loginroleId

Ответы [ 2 ]

1 голос
/ 09 марта 2011

Вы можете присоединиться к подзапросу, который будет возвращать идентификаторы учетных данных, которые имеют обе роли для входа.

SELECT E.*, C.*, P.*
FROM employee AS E
  INNER JOIN (
      SELECT credentialId
      FROM credential_has_loginrole
      WHERE loginroleId IN (1,2)
      GROUP BY credentialId
      HAVING COUNT(DISTINCT loginroleId) = 2
    ) g ON E.credentialId = g.credentialId
  INNER JOIN credential AS C ON (C.id = E.credentialId)
  LEFT JOIN person AS P ON (C.personId = P.id)

Обновление : Согласно комментариям, чтобы найти сотрудников с или или:

SELECT E.*, C.*, P.*
FROM employee AS E
  INNER JOIN (
      SELECT credentialId
      FROM credential_has_loginrole
      WHERE loginroleId IN (1,2)
      GROUP BY credentialId
    ) g ON E.credentialId = g.credentialId
  INNER JOIN credential AS C ON (C.id = E.credentialId)
  LEFT JOIN person AS P ON (C.personId = P.id)

Кроме того, вы можете использовать JOIN вместе с DISTINCT:

SELECT DISTINCT E.*, C.*, P.*
FROM employee AS E
  INNER JOIN credential AS C ON (C.id = E.credentialId)
  INNER JOIN credential_has_loginrole chr
    ON E.credentialId = chr.credentialId
      AND chr.loginroleId IN (1,2)
  LEFT JOIN person AS P ON (C.personId = P.id)
0 голосов
/ 09 марта 2011

Ответ Скрама Мейстера правильный.Вы также можете использовать 2 дерева соединения:

    SELECT *
    FROM employee AS E
    INNER JOIN credential AS c 
        INNER JOIN credential_has_loginrole chl0 ON (c0.id=chl0.credentialId AND chl0.loginroleId=1)
        INNER JOIN credential_has_loginrole chl1 ON (c0.id=chl1.credentialId AND chl1.loginroleId=2)
    ON (c.id = E.credentialId)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...