Как сделать так, чтобы (ЛЕВЫЙ?) ПРИСОЕДИНЯЙСЯ к работе - PullRequest
0 голосов
/ 07 ноября 2011

У меня есть три таблицы:

CREATE TABLE credential_types (
    id serial PRIMARY KEY,
    name varchar(32) NOT NULL,
    ...
);

CREATE TABLE credentials (
    user_id integer REFERENCES users(id),
    credential integer REFERENCES credential_types(id),
    UNIQUE (user_id, credential)
);

CREATE TABLE users (
    id serial PRIMARY KEY,
    name varchar(64),
    username varchar(64),
    ...
);

Теперь я хочу получить всех существующих пользователей и хочу выбрать конкретный тип учетных данных, который у них есть.Я попытался это сделать:

ribit=> SELECT u.id, u.name, u.username, ct.name AS cred \
         FROM users u, credential_types ct, credentials c \
         WHERE c.user_id=u.id AND ct.id=c.credential;
 id | name | username |  cred
----+------+----------+---------
  1 | foo  | bos      | Try-Out
(1 row)

Это правильный вид вывода, но все пользователи, у которых еще нет учетных данных (ноль), не учтены.Я не знаю, какой тип соединения мне нужен для этой операции.Я думаю Мне нужно СЛЕДУЮЩЕЕ СОЕДИНЕНИЕ, но я терплю неудачу, когда пытаюсь достичь того, что хочу:

ribit=> SELECT u.id, u.name, u.username, ct.name \
        FROM users u, credential_types ct \
        LEFT JOIN credentials c ON ct.id=c.credential;

дает мне перекрестное соединение с ошибочными данными.* Я ищу подсказки о том, как написать запрос для получения нужного результата.

Ответы [ 3 ]

0 голосов
/ 07 ноября 2011

Попробуйте

SELECT u.id, u.name, u.username, ct.name 
FROM users u
LEFT JOIN credentials c ON (u.id=c.user_id) 
JOIN credential_type ct ON ct.id=c.credential;
0 голосов
/ 07 ноября 2011

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

SELECT u.id, u.name, u.username, cred
FROM users u LEFT JOIN 
( SELECT ct.name AS cred, c.user_id 
  FROM credentials c JOIN credential_types ct ON c.credential=ct.id 
) ON u.id=c.user_id
0 голосов
/ 07 ноября 2011

Левое соединение не совсем в нужном месте.

SELECT u.id, u.name, u.username, ct.name
FROM   users u
LEFT JOIN credentials c ON u.id = c.user_id
INNER JOIN credential_types ct ON c.credential = ct.id

Я думаю, это ближе к тому, что вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...